{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.10","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":5,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## 用卷积神经网络训练Cifar100\nFor this tutorial, we will use the CIFAR100 dataset. ","metadata":{}},{"cell_type":"markdown","source":"## 1. Load and normalize CIFAR100\nUsing torchvision, it's extremely easy to load CIFAR100.","metadata":{}},{"cell_type":"code","source":"print(\"\")","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:09.140124Z","iopub.execute_input":"2023-05-27T15:20:09.140422Z","iopub.status.idle":"2023-05-27T15:20:09.152949Z","shell.execute_reply.started":"2023-05-27T15:20:09.140395Z","shell.execute_reply":"2023-05-27T15:20:09.151936Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stdout","text":"\n","output_type":"stream"}]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torchvision\nimport torchvision.transforms as transforms\nimport torch.optim.lr_scheduler as lr_scheduler\n# import matplotlib.pyplot as plt","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:11.413862Z","iopub.execute_input":"2023-05-27T15:20:11.414292Z","iopub.status.idle":"2023-05-27T15:20:15.255164Z","shell.execute_reply.started":"2023-05-27T15:20:11.414265Z","shell.execute_reply":"2023-05-27T15:20:15.254112Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"\ntorch.cuda.device_count()\n# Set the device\nif torch.cuda.is_available():\n    device = torch.device('cuda')\n    torch.cuda.set_device(0)\nelse:\n    device = torch.device('cpu')\nprint('Using PyTorch version:', torch.__version__, ' Device:', device)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:15.257350Z","iopub.execute_input":"2023-05-27T15:20:15.257965Z","iopub.status.idle":"2023-05-27T15:20:15.302865Z","shell.execute_reply.started":"2023-05-27T15:20:15.257929Z","shell.execute_reply":"2023-05-27T15:20:15.302142Z"},"trusted":true},"execution_count":3,"outputs":[{"name":"stdout","text":"Using PyTorch version: 2.0.0  Device: cuda\n","output_type":"stream"}]},{"cell_type":"markdown","source":"The output of torchvision datasets are PILImage images of range [0, 1]. We transform them to Tensors of normalized range [-1, 1].","metadata":{}},{"cell_type":"code","source":"!cp -r /kaggle/input/cifar100 /kaggle/working/","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!tar -zcvf /kaggle/working/cifar100.tar.gz ./*","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define the batch size and number of epochs\nbatch_size = 512\nnum_epochs = 200\n\n# Define the transformation for data preprocessing\ntransform_train = transforms.Compose([\n            transforms.RandomCrop(32, padding=4),\n            transforms.RandomHorizontalFlip(),\n            transforms.ToTensor(),\n            transforms.Normalize((0.4914, 0.4822, 0.4465),\n                                 (0.2023, 0.1994, 0.2010)),\n        ])\ntransform_test = transforms.Compose([\n            transforms.ToTensor(),\n            transforms.Normalize((0.4914, 0.4822, 0.4465),\n                                 (0.2023, 0.1994, 0.2010)),\n        ])\n\n# Load the CIFAR-100 dataset\ntrain_dataset = torchvision.datasets.CIFAR100(root='/kaggle/working/', train=True, download=True, transform=transform_train)\ntest_dataset = torchvision.datasets.CIFAR100(root='/kaggle/working/', train=False, download=True, transform=transform_test)\n\n# Create data loaders\ntrain_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2)\ntest_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:19.051937Z","iopub.execute_input":"2023-05-27T15:20:19.052623Z","iopub.status.idle":"2023-05-27T15:20:28.810063Z","shell.execute_reply.started":"2023-05-27T15:20:19.052588Z","shell.execute_reply":"2023-05-27T15:20:28.809135Z"},"trusted":true},"execution_count":4,"outputs":[{"name":"stdout","text":"Downloading https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz to /kaggle/working/cifar-100-python.tar.gz\n","output_type":"stream"},{"name":"stderr","text":"100%|██████████| 169001437/169001437 [00:05<00:00, 29343630.60it/s]\n","output_type":"stream"},{"name":"stdout","text":"Extracting /kaggle/working/cifar-100-python.tar.gz to /kaggle/working/\nFiles already downloaded and verified\n","output_type":"stream"}]},{"cell_type":"markdown","source":"## 2. Define SEK\n","metadata":{}},{"cell_type":"code","source":"!pip install timm","metadata":{"execution":{"iopub.status.busy":"2023-05-26T11:37:50.641950Z","iopub.execute_input":"2023-05-26T11:37:50.642317Z","iopub.status.idle":"2023-05-26T11:37:57.992527Z","shell.execute_reply.started":"2023-05-26T11:37:50.642290Z","shell.execute_reply":"2023-05-26T11:37:57.991335Z"},"trusted":true},"execution_count":8,"outputs":[{"name":"stdout","text":"Collecting timm\n  Downloading timm-0.9.2-py3-none-any.whl (2.2 MB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.2/2.2 MB\u001b[0m \u001b[31m22.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m0:01\u001b[0m\n\u001b[?25hRequirement already satisfied: torchvision in /usr/local/lib/python3.8/site-packages (from timm) (0.15.1)\nCollecting huggingface-hub\n  Downloading huggingface_hub-0.14.1-py3-none-any.whl (224 kB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m224.5/224.5 KB\u001b[0m \u001b[31m17.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hCollecting safetensors\n  Downloading safetensors-0.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m50.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hRequirement already satisfied: torch>=1.7 in /usr/local/lib/python3.8/site-packages (from timm) (2.0.0)\nRequirement already satisfied: pyyaml in /usr/local/lib/python3.8/site-packages (from timm) (6.0)\nRequirement already satisfied: nvidia-curand-cu11==10.2.10.91 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (10.2.10.91)\nRequirement already satisfied: nvidia-cuda-cupti-cu11==11.7.101 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (11.7.101)\nRequirement already satisfied: nvidia-cuda-nvrtc-cu11==11.7.99 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (11.7.99)\nRequirement already satisfied: nvidia-cusolver-cu11==11.4.0.1 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (11.4.0.1)\nRequirement already satisfied: nvidia-cusparse-cu11==11.7.4.91 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (11.7.4.91)\nRequirement already satisfied: filelock in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (3.12.0)\nRequirement already satisfied: sympy in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (1.12)\nRequirement already satisfied: nvidia-cufft-cu11==10.9.0.58 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (10.9.0.58)\nRequirement already satisfied: nvidia-cuda-runtime-cu11==11.7.99 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (11.7.99)\nRequirement already satisfied: networkx in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (3.1)\nRequirement already satisfied: jinja2 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (3.1.2)\nRequirement already satisfied: nvidia-cudnn-cu11==8.5.0.96 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (8.5.0.96)\nRequirement already satisfied: nvidia-nvtx-cu11==11.7.91 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (11.7.91)\nRequirement already satisfied: triton==2.0.0 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (2.0.0)\nRequirement already satisfied: typing-extensions in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (4.6.0)\nRequirement already satisfied: nvidia-cublas-cu11==11.10.3.66 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (11.10.3.66)\nRequirement already satisfied: nvidia-nccl-cu11==2.14.3 in /usr/local/lib/python3.8/site-packages (from torch>=1.7->timm) (2.14.3)\nRequirement already satisfied: wheel in /usr/local/lib/python3.8/site-packages (from nvidia-cublas-cu11==11.10.3.66->torch>=1.7->timm) (0.40.0)\nRequirement already satisfied: setuptools in /usr/local/lib/python3.8/site-packages (from nvidia-cublas-cu11==11.10.3.66->torch>=1.7->timm) (57.5.0)\nRequirement already satisfied: cmake in /usr/local/lib/python3.8/site-packages (from triton==2.0.0->torch>=1.7->timm) (3.26.3)\nRequirement already satisfied: lit in /usr/local/lib/python3.8/site-packages (from triton==2.0.0->torch>=1.7->timm) (16.0.5)\nRequirement already satisfied: requests in /usr/local/lib/python3.8/site-packages (from huggingface-hub->timm) (2.31.0)\nCollecting fsspec\n  Downloading fsspec-2023.5.0-py3-none-any.whl (160 kB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m160.1/160.1 KB\u001b[0m \u001b[31m13.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hRequirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.8/site-packages (from huggingface-hub->timm) (4.65.0)\nRequirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.8/site-packages (from huggingface-hub->timm) (23.1)\nRequirement already satisfied: numpy in /usr/local/lib/python3.8/site-packages (from torchvision->timm) (1.23.5)\nRequirement already satisfied: pillow!=8.3.*,>=5.3.0 in /usr/local/lib/python3.8/site-packages (from torchvision->timm) (9.5.0)\nRequirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.8/site-packages (from jinja2->torch>=1.7->timm) (2.1.2)\nRequirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.8/site-packages (from requests->huggingface-hub->timm) (3.1.0)\nRequirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.8/site-packages (from requests->huggingface-hub->timm) (3.4)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.8/site-packages (from requests->huggingface-hub->timm) (1.26.16)\nRequirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.8/site-packages (from requests->huggingface-hub->timm) (2023.5.7)\nRequirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.8/site-packages (from sympy->torch>=1.7->timm) (1.3.0)\nInstalling collected packages: safetensors, fsspec, huggingface-hub, timm\nSuccessfully installed fsspec-2023.5.0 huggingface-hub-0.14.1 safetensors-0.3.1 timm-0.9.2\n\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n\u001b[0m\u001b[33mWARNING: You are using pip version 22.0.4; however, version 23.1.2 is available.\nYou should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.\u001b[0m\u001b[33m\n\u001b[0m","output_type":"stream"}]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom functools import partial\n\nfrom timm.models.layers import DropPath, to_2tuple, trunc_normal_\nfrom timm.models.registry import register_model\nfrom timm.models.vision_transformer import _cfg\nimport math\nclass Mlp(nn.Module):\n    def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.):\n        super().__init__()\n        out_features = out_features or in_features\n        hidden_features = hidden_features or in_features\n        self.fc1 = nn.Conv2d(in_features, hidden_features, 1)\n        self.dwconv = DWConv(hidden_features)\n        self.act = act_layer()\n        self.fc2 = nn.Conv2d(hidden_features, out_features, 1)\n        self.drop = nn.Dropout(drop)\n        self.apply(self._init_weights)\n\n    def _init_weights(self, m):\n        if isinstance(m, nn.Linear):\n            trunc_normal_(m.weight, std=.02)\n            if isinstance(m, nn.Linear) and m.bias is not None:\n                nn.init.constant_(m.bias, 0)\n        elif isinstance(m, nn.LayerNorm):\n            nn.init.constant_(m.bias, 0)\n            nn.init.constant_(m.weight, 1.0)\n        elif isinstance(m, nn.Conv2d):\n            fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels\n            fan_out //= m.groups\n            m.weight.data.normal_(0, math.sqrt(2.0 / fan_out))\n            if m.bias is not None:\n                m.bias.data.zero_()\n\n    def forward(self, x):\n        x = self.fc1(x)\n        x = self.dwconv(x)\n        x = self.act(x)\n        x = self.drop(x)\n        x = self.fc2(x)\n        x = self.drop(x)\n        return x\n\n\n\n\nclass LKA(nn.Module):\n    def __init__(self, dim):\n        super().__init__()\n        self.conv0 = nn.Conv2d(dim, dim, 5, padding=2, groups=dim)\n        self.conv_spatial = nn.Conv2d(dim, dim, 7, stride=1, padding=9, groups=dim, dilation=3)\n        self.conv1 = nn.Conv2d(dim, dim, 1)\n\n\n    def forward(self, x):\n        u = x.clone()        \n        attn = self.conv0(x)\n        attn = self.conv_spatial(attn)\n        attn = self.conv1(attn)\n\n        return u * attn\n\n\nclass Attention(nn.Module):\n    def __init__(self, d_model):\n        super().__init__()\n\n        self.proj_1 = nn.Conv2d(d_model, d_model, 1)\n        self.activation = nn.GELU()\n        self.spatial_gating_unit = LKA(d_model)\n        self.proj_2 = nn.Conv2d(d_model, d_model, 1)\n\n    def forward(self, x):\n        shorcut = x.clone()\n        x = self.proj_1(x)\n        x = self.activation(x)\n        x = self.spatial_gating_unit(x)\n        x = self.proj_2(x)\n        x = x + shorcut\n        return x\n\n\nclass Block(nn.Module):\n    def __init__(self, dim, mlp_ratio=4., drop=0.,drop_path=0., act_layer=nn.GELU):\n        super().__init__()\n        self.norm1 = nn.BatchNorm2d(dim)\n        self.attn = Attention(dim)\n        self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()\n\n        self.norm2 = nn.BatchNorm2d(dim)\n        mlp_hidden_dim = int(dim * mlp_ratio)\n        self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop)\n        layer_scale_init_value = 1e-2            \n        self.layer_scale_1 = nn.Parameter(\n            layer_scale_init_value * torch.ones((dim)), requires_grad=True)\n        self.layer_scale_2 = nn.Parameter(\n            layer_scale_init_value * torch.ones((dim)), requires_grad=True)\n\n        self.apply(self._init_weights)\n\n    def _init_weights(self, m):\n        if isinstance(m, nn.Linear):\n            trunc_normal_(m.weight, std=.02)\n            if isinstance(m, nn.Linear) and m.bias is not None:\n                nn.init.constant_(m.bias, 0)\n        elif isinstance(m, nn.LayerNorm):\n            nn.init.constant_(m.bias, 0)\n            nn.init.constant_(m.weight, 1.0)\n        elif isinstance(m, nn.Conv2d):\n            fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels\n            fan_out //= m.groups\n            m.weight.data.normal_(0, math.sqrt(2.0 / fan_out))\n            if m.bias is not None:\n                m.bias.data.zero_()\n\n    def forward(self, x):\n        x = x + self.drop_path(self.layer_scale_1.unsqueeze(-1).unsqueeze(-1) * self.attn(self.norm1(x)))\n        x = x + self.drop_path(self.layer_scale_2.unsqueeze(-1).unsqueeze(-1) * self.mlp(self.norm2(x)))\n        return x\n\n\nclass OverlapPatchEmbed(nn.Module):\n    \"\"\" Image to Patch Embedding\n    \"\"\"\n\n    def __init__(self, img_size=1024, patch_size=7, stride=4, in_chans=3, embed_dim=768):\n        super().__init__()\n        patch_size = to_2tuple(patch_size)\n        self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=stride,\n                              padding=(patch_size[0] // 2, patch_size[1] // 2))\n        self.norm = nn.BatchNorm2d(embed_dim)\n\n        self.apply(self._init_weights)\n\n    def _init_weights(self, m):\n        if isinstance(m, nn.Linear):\n            trunc_normal_(m.weight, std=.02)\n            if isinstance(m, nn.Linear) and m.bias is not None:\n                nn.init.constant_(m.bias, 0)\n        elif isinstance(m, nn.LayerNorm):\n            nn.init.constant_(m.bias, 0)\n            nn.init.constant_(m.weight, 1.0)\n        elif isinstance(m, nn.Conv2d):\n            fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels\n            fan_out //= m.groups\n            m.weight.data.normal_(0, math.sqrt(2.0 / fan_out))\n            if m.bias is not None:\n                m.bias.data.zero_()\n\n    def forward(self, x):\n        x = self.proj(x)\n        _, _, H, W = x.shape\n        x = self.norm(x)        \n        return x, H, W\n\n\nclass VAN(nn.Module):\n    def __init__(self, img_size=1024, in_chans=3, num_classes=100, embed_dims=[64, 128, 256, 512],\n                mlp_ratios=[4, 4, 4, 4], drop_rate=0., drop_path_rate=0., norm_layer=nn.LayerNorm,\n                 depths=[3, 4, 6, 3], num_stages=4, flag=False):\n        super().__init__()\n        if flag == False:\n            self.num_classes = num_classes\n        self.depths = depths\n        self.num_stages = num_stages\n\n        dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))]  # stochastic depth decay rule\n        cur = 0\n\n        for i in range(num_stages):\n            patch_embed = OverlapPatchEmbed(img_size=img_size if i == 0 else img_size // (2 ** (i + 1)),\n                                            patch_size=7 if i == 0 else 3,\n                                            stride=4 if i == 0 else 2,\n                                            in_chans=in_chans if i == 0 else embed_dims[i - 1],\n                                            embed_dim=embed_dims[i])\n\n            block = nn.ModuleList([Block(\n                dim=embed_dims[i], mlp_ratio=mlp_ratios[i], drop=drop_rate, drop_path=dpr[cur + j])\n                for j in range(depths[i])])\n            norm = norm_layer(embed_dims[i])\n            cur += depths[i]\n\n            setattr(self, f\"patch_embed{i + 1}\", patch_embed)\n            setattr(self, f\"block{i + 1}\", block)\n            setattr(self, f\"norm{i + 1}\", norm)\n\n        # classification head\n        self.head = nn.Linear(embed_dims[3], num_classes) if num_classes > 0 else nn.Identity()\n\n        self.apply(self._init_weights)\n\n    def _init_weights(self, m):\n        if isinstance(m, nn.Linear):\n            trunc_normal_(m.weight, std=.02)\n            if isinstance(m, nn.Linear) and m.bias is not None:\n                nn.init.constant_(m.bias, 0)\n        elif isinstance(m, nn.LayerNorm):\n            nn.init.constant_(m.bias, 0)\n            nn.init.constant_(m.weight, 1.0)\n        elif isinstance(m, nn.Conv2d):\n            fan_out = m.kernel_size[0] * m.kernel_size[1] * m.out_channels\n            fan_out //= m.groups\n            m.weight.data.normal_(0, math.sqrt(2.0 / fan_out))\n            if m.bias is not None:\n                m.bias.data.zero_()\n\n    def freeze_patch_emb(self):\n        self.patch_embed1.requires_grad = False\n\n    @torch.jit.ignore\n    def no_weight_decay(self):\n        return {'pos_embed1', 'pos_embed2', 'pos_embed3', 'pos_embed4', 'cls_token'}  # has pos_embed may be better\n\n    def get_classifier(self):\n        return self.head\n\n    def reset_classifier(self, num_classes, global_pool=''):\n        self.num_classes = num_classes\n        self.head = nn.Linear(self.embed_dim, num_classes) if num_classes > 0 else nn.Identity()\n\n    def forward_features(self, x):\n        B = x.shape[0]\n\n        for i in range(self.num_stages):\n            patch_embed = getattr(self, f\"patch_embed{i + 1}\")\n            block = getattr(self, f\"block{i + 1}\")\n            norm = getattr(self, f\"norm{i + 1}\")\n            x, H, W = patch_embed(x)\n            for blk in block:\n                x = blk(x)\n            x = x.flatten(2).transpose(1, 2)\n            x = norm(x)\n            if i != self.num_stages - 1:\n                x = x.reshape(B, H, W, -1).permute(0, 3, 1, 2).contiguous()\n\n        return x.mean(dim=1)\n\n    def forward(self, x):\n        x = self.forward_features(x)\n        x = self.head(x)\n\n        return x\n\n\nclass DWConv(nn.Module):\n    def __init__(self, dim=768):\n        super(DWConv, self).__init__()\n        self.dwconv = nn.Conv2d(dim, dim, 3, 1, 1, bias=True, groups=dim)\n\n    def forward(self, x):\n        x = self.dwconv(x)\n        return x\n\n\ndef _conv_filter(state_dict, patch_size=16):\n    \"\"\" convert patch embedding weight from manual patchify + linear proj to conv\"\"\"\n    out_dict = {}\n    for k, v in state_dict.items():\n        if 'patch_embed.proj.weight' in k:\n            v = v.reshape((v.shape[0], 3, patch_size, patch_size))\n        out_dict[k] = v\n\n    return out_dict","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:33.570470Z","iopub.execute_input":"2023-05-27T15:20:33.570829Z","iopub.status.idle":"2023-05-27T15:20:33.624540Z","shell.execute_reply.started":"2023-05-27T15:20:33.570800Z","shell.execute_reply":"2023-05-27T15:20:33.623182Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"# Initialize the model\nmodel = VAN().to(device)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:34.634516Z","iopub.execute_input":"2023-05-27T15:20:34.634899Z","iopub.status.idle":"2023-05-27T15:20:37.943190Z","shell.execute_reply.started":"2023-05-27T15:20:34.634852Z","shell.execute_reply":"2023-05-27T15:20:37.942132Z"},"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"!cp /kaggle/input/van-pth/cifar_van1.pth /kaggle/working/vanpth/cifar_van1.pth","metadata":{"execution":{"iopub.status.busy":"2023-05-25T16:21:19.772078Z","iopub.execute_input":"2023-05-25T16:21:19.772542Z","iopub.status.idle":"2023-05-25T16:21:22.565099Z","shell.execute_reply.started":"2023-05-25T16:21:19.772487Z","shell.execute_reply":"2023-05-25T16:21:22.563766Z"},"trusted":true},"execution_count":19,"outputs":[]},{"cell_type":"code","source":"# Load the model\nPATH = '/kaggle/working/vanpth/cifar_van3.pth'\nmodel.load_state_dict(torch.load(PATH))","metadata":{"execution":{"iopub.status.busy":"2023-05-26T12:36:49.070277Z","iopub.execute_input":"2023-05-26T12:36:49.071094Z","iopub.status.idle":"2023-05-26T12:36:49.227470Z","shell.execute_reply.started":"2023-05-26T12:36:49.071051Z","shell.execute_reply":"2023-05-26T12:36:49.226427Z"},"trusted":true},"execution_count":16,"outputs":[{"execution_count":16,"output_type":"execute_result","data":{"text/plain":"<All keys matched successfully>"},"metadata":{}}]},{"cell_type":"markdown","source":"## 3. Define a Loss function and optimizer\nLet’s use a Classification Cross-Entropy loss and Adam.","metadata":{}},{"cell_type":"code","source":"# Define the loss function and optimizer\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-3)\n\n# Define the learning rate schedule\nlr_schedule_milestones = [int(num_epochs * 0.5), int(num_epochs * 0.75)]  # 50% and 75% of total training epochs\nlr_schedule_gamma = 0.1  # Learning rate reduction factor\n\n# Define the learning rate scheduler\nscheduler = lr_scheduler.MultiStepLR(optimizer, milestones=lr_schedule_milestones, gamma=lr_schedule_gamma)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:40.459689Z","iopub.execute_input":"2023-05-27T15:20:40.460048Z","iopub.status.idle":"2023-05-27T15:20:40.469388Z","shell.execute_reply.started":"2023-05-27T15:20:40.460018Z","shell.execute_reply":"2023-05-27T15:20:40.468526Z"},"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"markdown","source":"## 4. Train the network\nThis is when things start to get interesting. We simply have to loop over our data iterator, and feed the inputs to the network and optimize.","metadata":{}},{"cell_type":"code","source":"# Lists to store training and testing losses, and accuracies\ntrain_losses = []\ntest_losses = []\ntrain_accs = []\ntest_accs = []","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:42.636374Z","iopub.execute_input":"2023-05-27T15:20:42.637405Z","iopub.status.idle":"2023-05-27T15:20:42.642572Z","shell.execute_reply.started":"2023-05-27T15:20:42.637358Z","shell.execute_reply":"2023-05-27T15:20:42.641507Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"# Training loop\ntotal_steps = len(train_loader)\nfor epoch in range(num_epochs):\n    train_loss = 0.0\n    train_total = 0\n    train_correct = 0\n\n    for i, (images, labels) in enumerate(train_loader):\n        images = images.to(device)\n        labels = labels.to(device)\n        # Forward pass\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        # Backward and optimize\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n       \n        train_loss += loss.item()\n        _, predicted = torch.max(outputs.data, 1)\n        train_total += labels.size(0)\n        train_correct += (predicted == labels).sum().item()\n        # Print training progress\n        if (i + 1) % 100 == 0:\n            print(\n                f\"Epoch [{epoch + 1}/{num_epochs}], Step [{i + 1}/{total_steps}], Loss: {train_loss / (i + 1):.4f}\")\n      \n    train_acc = 100.0 * train_correct / train_total\n    train_losses.append(train_loss / total_steps)\n    train_accs.append(train_acc)\n    scheduler.step()\n    \n    # Evaluation on the test set\n    model.eval()\n    test_loss = 0.0\n    test_total = 0\n    test_correct = 0\n\n    with torch.no_grad():\n        for images, labels in test_loader:\n            images = images.to(device)\n            labels = labels.to(device)\n\n            # Forward pass\n            outputs = model(images)\n            loss = criterion(outputs, labels)\n\n            test_loss += loss.item()\n            _, predicted = torch.max(outputs.data, 1)\n            test_total += labels.size(0)\n            test_correct += (predicted == labels).sum().item()\n\n    test_acc = 100.0 * test_correct / test_total\n    test_losses.append(test_loss / len(test_loader))\n    test_accs.append(test_acc)\n\n    # Print test accuracy for the current epoch\n    print(f\"Epoch [{epoch+1}/{num_epochs}], Test Loss: {test_loss / len(test_loader):.4f}, Test Accuracy: {test_acc:.2f}%\")\n\n    # Switch back to training mode\n    model.train()","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:20:49.274316Z","iopub.execute_input":"2023-05-27T15:20:49.274652Z","iopub.status.idle":"2023-05-27T17:20:40.035884Z","shell.execute_reply.started":"2023-05-27T15:20:49.274624Z","shell.execute_reply":"2023-05-27T17:20:40.033962Z"},"trusted":true},"execution_count":10,"outputs":[{"name":"stdout","text":"Epoch [1/200], Test Loss: 3.8917, Test Accuracy: 12.57%\nEpoch [2/200], Test Loss: 3.7285, Test Accuracy: 14.41%\nEpoch [3/200], Test Loss: 3.6215, Test Accuracy: 16.90%\nEpoch [4/200], Test Loss: 3.5472, Test Accuracy: 17.79%\nEpoch [5/200], Test Loss: 3.4920, Test Accuracy: 19.29%\nEpoch [6/200], Test Loss: 3.4028, Test Accuracy: 20.56%\nEpoch [7/200], Test Loss: 3.3631, Test Accuracy: 21.75%\nEpoch [8/200], Test Loss: 3.3003, Test Accuracy: 22.76%\nEpoch [9/200], Test Loss: 3.2458, Test Accuracy: 23.32%\nEpoch [10/200], Test Loss: 3.1927, Test Accuracy: 24.68%\nEpoch [11/200], Test Loss: 3.1835, Test Accuracy: 24.63%\nEpoch [12/200], Test Loss: 3.1462, Test Accuracy: 24.71%\nEpoch [13/200], Test Loss: 3.0821, Test Accuracy: 26.49%\nEpoch [14/200], Test Loss: 3.0842, Test Accuracy: 25.80%\nEpoch [15/200], Test Loss: 3.0303, Test Accuracy: 27.41%\nEpoch [16/200], Test Loss: 2.9881, Test Accuracy: 28.22%\nEpoch [18/200], Test Loss: 2.9632, Test Accuracy: 28.20%\nEpoch [19/200], Test Loss: 2.9866, Test Accuracy: 28.37%\nEpoch [20/200], Test Loss: 2.9369, Test Accuracy: 28.66%\nEpoch [21/200], Test Loss: 2.9510, Test Accuracy: 28.67%\nEpoch [22/200], Test Loss: 2.9309, Test Accuracy: 29.19%\nEpoch [23/200], Test Loss: 2.9777, Test Accuracy: 28.18%\nEpoch [24/200], Test Loss: 2.9061, Test Accuracy: 29.16%\nEpoch [25/200], Test Loss: 2.8879, Test Accuracy: 30.04%\nEpoch [26/200], Test Loss: 2.8993, Test Accuracy: 29.07%\nEpoch [27/200], Test Loss: 2.9589, Test Accuracy: 28.77%\nEpoch [28/200], Test Loss: 2.8146, Test Accuracy: 30.96%\nEpoch [29/200], Test Loss: 2.8542, Test Accuracy: 30.23%\nEpoch [30/200], Test Loss: 2.8295, Test Accuracy: 31.02%\nEpoch [31/200], Test Loss: 2.8457, Test Accuracy: 30.54%\nEpoch [32/200], Test Loss: 2.8480, Test Accuracy: 30.44%\nEpoch [33/200], Test Loss: 2.8589, Test Accuracy: 29.59%\nEpoch [34/200], Test Loss: 2.8083, Test Accuracy: 30.76%\nEpoch [35/200], Test Loss: 2.8618, Test Accuracy: 29.82%\nEpoch [36/200], Test Loss: 2.8546, Test Accuracy: 30.07%\nEpoch [37/200], Test Loss: 2.7697, Test Accuracy: 31.86%\nEpoch [38/200], Test Loss: 2.8079, Test Accuracy: 31.35%\nEpoch [39/200], Test Loss: 2.9052, Test Accuracy: 29.07%\nEpoch [40/200], Test Loss: 2.8972, Test Accuracy: 29.18%\nEpoch [41/200], Test Loss: 2.8453, Test Accuracy: 30.60%\nEpoch [42/200], Test Loss: 2.8172, Test Accuracy: 30.93%\nEpoch [43/200], Test Loss: 2.8772, Test Accuracy: 29.25%\nEpoch [44/200], Test Loss: 2.7415, Test Accuracy: 32.64%\nEpoch [45/200], Test Loss: 2.8141, Test Accuracy: 30.89%\nEpoch [46/200], Test Loss: 2.8028, Test Accuracy: 31.61%\nEpoch [47/200], Test Loss: 2.8892, Test Accuracy: 28.42%\nEpoch [48/200], Test Loss: 2.7665, Test Accuracy: 31.58%\nEpoch [49/200], Test Loss: 2.7429, Test Accuracy: 31.70%\nEpoch [50/200], Test Loss: 2.7267, Test Accuracy: 31.55%\nEpoch [51/200], Test Loss: 2.7596, Test Accuracy: 31.26%\nEpoch [52/200], Test Loss: 2.7420, Test Accuracy: 31.94%\nEpoch [53/200], Test Loss: 2.8056, Test Accuracy: 31.12%\nEpoch [54/200], Test Loss: 2.6918, Test Accuracy: 32.52%\nEpoch [55/200], Test Loss: 2.7332, Test Accuracy: 31.62%\nEpoch [56/200], Test Loss: 2.9730, Test Accuracy: 26.23%\nEpoch [57/200], Test Loss: 2.7392, Test Accuracy: 31.58%\nEpoch [58/200], Test Loss: 2.7233, Test Accuracy: 31.53%\nEpoch [59/200], Test Loss: 2.6670, Test Accuracy: 32.67%\nEpoch [60/200], Test Loss: 2.6820, Test Accuracy: 32.95%\nEpoch [61/200], Test Loss: 2.6758, Test Accuracy: 32.54%\nEpoch [62/200], Test Loss: 2.6783, Test Accuracy: 32.88%\nEpoch [63/200], Test Loss: 2.7532, Test Accuracy: 31.10%\nEpoch [64/200], Test Loss: 2.7054, Test Accuracy: 32.59%\nEpoch [65/200], Test Loss: 2.7851, Test Accuracy: 30.94%\nEpoch [66/200], Test Loss: 2.6406, Test Accuracy: 33.76%\nEpoch [67/200], Test Loss: 2.8153, Test Accuracy: 30.48%\nEpoch [68/200], Test Loss: 2.6648, Test Accuracy: 33.06%\nEpoch [69/200], Test Loss: 2.6512, Test Accuracy: 33.19%\nEpoch [70/200], Test Loss: 2.5812, Test Accuracy: 35.08%\nEpoch [71/200], Test Loss: 2.7275, Test Accuracy: 31.80%\nEpoch [72/200], Test Loss: 2.8259, Test Accuracy: 29.74%\nEpoch [73/200], Test Loss: 2.6434, Test Accuracy: 33.30%\nEpoch [74/200], Test Loss: 2.6956, Test Accuracy: 32.11%\nEpoch [75/200], Test Loss: 2.7470, Test Accuracy: 31.58%\nEpoch [76/200], Test Loss: 2.7167, Test Accuracy: 31.88%\nEpoch [77/200], Test Loss: 2.6528, Test Accuracy: 33.33%\nEpoch [78/200], Test Loss: 2.7099, Test Accuracy: 31.31%\nEpoch [79/200], Test Loss: 2.7640, Test Accuracy: 31.15%\nEpoch [80/200], Test Loss: 2.6703, Test Accuracy: 33.05%\nEpoch [81/200], Test Loss: 2.7553, Test Accuracy: 30.57%\nEpoch [82/200], Test Loss: 2.6386, Test Accuracy: 33.21%\nEpoch [83/200], Test Loss: 2.6398, Test Accuracy: 33.61%\nEpoch [84/200], Test Loss: 2.7202, Test Accuracy: 32.03%\nEpoch [85/200], Test Loss: 2.6642, Test Accuracy: 32.89%\nEpoch [86/200], Test Loss: 2.6388, Test Accuracy: 33.44%\nEpoch [87/200], Test Loss: 2.8163, Test Accuracy: 29.56%\nEpoch [88/200], Test Loss: 2.6635, Test Accuracy: 32.58%\nEpoch [89/200], Test Loss: 2.6396, Test Accuracy: 33.54%\nEpoch [90/200], Test Loss: 2.5842, Test Accuracy: 34.40%\nEpoch [91/200], Test Loss: 2.6785, Test Accuracy: 33.11%\nEpoch [92/200], Test Loss: 2.6531, Test Accuracy: 33.25%\nEpoch [93/200], Test Loss: 2.6104, Test Accuracy: 33.67%\nEpoch [94/200], Test Loss: 2.6279, Test Accuracy: 33.57%\nEpoch [95/200], Test Loss: 2.5929, Test Accuracy: 34.07%\nEpoch [96/200], Test Loss: 2.6580, Test Accuracy: 32.97%\nEpoch [97/200], Test Loss: 2.6457, Test Accuracy: 33.68%\nEpoch [98/200], Test Loss: 2.6214, Test Accuracy: 33.82%\nEpoch [99/200], Test Loss: 2.6343, Test Accuracy: 33.50%\nEpoch [100/200], Test Loss: 2.6080, Test Accuracy: 33.80%\nEpoch [101/200], Test Loss: 2.4511, Test Accuracy: 37.56%\nEpoch [102/200], Test Loss: 2.4398, Test Accuracy: 37.69%\nEpoch [103/200], Test Loss: 2.4309, Test Accuracy: 38.04%\nEpoch [104/200], Test Loss: 2.4248, Test Accuracy: 37.76%\nEpoch [105/200], Test Loss: 2.4159, Test Accuracy: 38.19%\nEpoch [106/200], Test Loss: 2.4147, Test Accuracy: 38.10%\nEpoch [107/200], Test Loss: 2.4298, Test Accuracy: 37.93%\nEpoch [108/200], Test Loss: 2.4150, Test Accuracy: 38.30%\nEpoch [109/200], Test Loss: 2.4162, Test Accuracy: 38.21%\nEpoch [110/200], Test Loss: 2.4086, Test Accuracy: 38.57%\nEpoch [111/200], Test Loss: 2.4023, Test Accuracy: 38.39%\nEpoch [112/200], Test Loss: 2.4162, Test Accuracy: 38.02%\nEpoch [113/200], Test Loss: 2.4061, Test Accuracy: 38.71%\nEpoch [114/200], Test Loss: 2.3975, Test Accuracy: 38.73%\nEpoch [115/200], Test Loss: 2.4012, Test Accuracy: 38.38%\nEpoch [116/200], Test Loss: 2.3927, Test Accuracy: 38.41%\nEpoch [117/200], Test Loss: 2.4127, Test Accuracy: 38.00%\nEpoch [118/200], Test Loss: 2.3983, Test Accuracy: 38.34%\nEpoch [119/200], Test Loss: 2.4101, Test Accuracy: 38.54%\nEpoch [120/200], Test Loss: 2.3818, Test Accuracy: 38.97%\nEpoch [121/200], Test Loss: 2.4026, Test Accuracy: 38.58%\nEpoch [122/200], Test Loss: 2.4004, Test Accuracy: 38.34%\nEpoch [123/200], Test Loss: 2.3869, Test Accuracy: 38.86%\nEpoch [124/200], Test Loss: 2.3863, Test Accuracy: 38.61%\nEpoch [125/200], Test Loss: 2.3961, Test Accuracy: 38.78%\nEpoch [126/200], Test Loss: 2.3917, Test Accuracy: 38.59%\nEpoch [127/200], Test Loss: 2.3768, Test Accuracy: 39.12%\nEpoch [128/200], Test Loss: 2.3875, Test Accuracy: 38.79%\nEpoch [129/200], Test Loss: 2.3755, Test Accuracy: 38.98%\nEpoch [130/200], Test Loss: 2.3894, Test Accuracy: 39.03%\nEpoch [131/200], Test Loss: 2.3937, Test Accuracy: 38.67%\nEpoch [132/200], Test Loss: 2.3867, Test Accuracy: 38.73%\nEpoch [133/200], Test Loss: 2.3814, Test Accuracy: 38.90%\nEpoch [134/200], Test Loss: 2.3750, Test Accuracy: 39.07%\nEpoch [135/200], Test Loss: 2.3770, Test Accuracy: 39.28%\nEpoch [136/200], Test Loss: 2.3817, Test Accuracy: 39.07%\nEpoch [137/200], Test Loss: 2.3759, Test Accuracy: 39.27%\nEpoch [138/200], Test Loss: 2.3786, Test Accuracy: 38.98%\nEpoch [139/200], Test Loss: 2.3933, Test Accuracy: 38.37%\nEpoch [140/200], Test Loss: 2.3871, Test Accuracy: 39.11%\nEpoch [141/200], Test Loss: 2.3854, Test Accuracy: 38.95%\nEpoch [142/200], Test Loss: 2.3880, Test Accuracy: 38.72%\nEpoch [143/200], Test Loss: 2.3794, Test Accuracy: 38.82%\nEpoch [144/200], Test Loss: 2.3655, Test Accuracy: 39.21%\nEpoch [145/200], Test Loss: 2.3874, Test Accuracy: 39.10%\nEpoch [146/200], Test Loss: 2.3971, Test Accuracy: 38.42%\nEpoch [147/200], Test Loss: 2.3751, Test Accuracy: 39.07%\nEpoch [148/200], Test Loss: 2.3722, Test Accuracy: 39.44%\nEpoch [149/200], Test Loss: 2.4037, Test Accuracy: 38.28%\nEpoch [150/200], Test Loss: 2.3816, Test Accuracy: 38.87%\nEpoch [151/200], Test Loss: 2.3349, Test Accuracy: 40.13%\nEpoch [152/200], Test Loss: 2.3306, Test Accuracy: 40.04%\nEpoch [153/200], Test Loss: 2.3283, Test Accuracy: 40.21%\nEpoch [154/200], Test Loss: 2.3287, Test Accuracy: 40.27%\nEpoch [155/200], Test Loss: 2.3235, Test Accuracy: 40.34%\nEpoch [156/200], Test Loss: 2.3232, Test Accuracy: 40.46%\nEpoch [157/200], Test Loss: 2.3234, Test Accuracy: 40.24%\nEpoch [158/200], Test Loss: 2.3232, Test Accuracy: 40.35%\nEpoch [159/200], Test Loss: 2.3222, Test Accuracy: 40.40%\nEpoch [160/200], Test Loss: 2.3231, Test Accuracy: 40.40%\nEpoch [161/200], Test Loss: 2.3218, Test Accuracy: 40.44%\nEpoch [162/200], Test Loss: 2.3181, Test Accuracy: 40.50%\nEpoch [163/200], Test Loss: 2.3198, Test Accuracy: 40.47%\nEpoch [164/200], Test Loss: 2.3213, Test Accuracy: 40.67%\nEpoch [165/200], Test Loss: 2.3196, Test Accuracy: 40.37%\nEpoch [166/200], Test Loss: 2.3222, Test Accuracy: 40.33%\nEpoch [167/200], Test Loss: 2.3171, Test Accuracy: 40.60%\nEpoch [168/200], Test Loss: 2.3230, Test Accuracy: 40.41%\nEpoch [169/200], Test Loss: 2.3189, Test Accuracy: 40.34%\nEpoch [170/200], Test Loss: 2.3184, Test Accuracy: 40.20%\nEpoch [171/200], Test Loss: 2.3141, Test Accuracy: 40.53%\nEpoch [172/200], Test Loss: 2.3183, Test Accuracy: 40.41%\nEpoch [173/200], Test Loss: 2.3165, Test Accuracy: 40.72%\nEpoch [174/200], Test Loss: 2.3143, Test Accuracy: 40.59%\nEpoch [175/200], Test Loss: 2.3171, Test Accuracy: 40.47%\nEpoch [176/200], Test Loss: 2.3154, Test Accuracy: 40.36%\nEpoch [177/200], Test Loss: 2.3165, Test Accuracy: 40.55%\nEpoch [178/200], Test Loss: 2.3164, Test Accuracy: 40.49%\nEpoch [179/200], Test Loss: 2.3175, Test Accuracy: 40.49%\nEpoch [180/200], Test Loss: 2.3189, Test Accuracy: 40.51%\nEpoch [181/200], Test Loss: 2.3134, Test Accuracy: 40.52%\nEpoch [182/200], Test Loss: 2.3144, Test Accuracy: 40.68%\nEpoch [183/200], Test Loss: 2.3115, Test Accuracy: 40.61%\nEpoch [184/200], Test Loss: 2.3138, Test Accuracy: 40.69%\nEpoch [185/200], Test Loss: 2.3142, Test Accuracy: 40.47%\nEpoch [186/200], Test Loss: 2.3163, Test Accuracy: 40.62%\nEpoch [187/200], Test Loss: 2.3131, Test Accuracy: 40.50%\nEpoch [188/200], Test Loss: 2.3117, Test Accuracy: 40.66%\nEpoch [189/200], Test Loss: 2.3110, Test Accuracy: 40.85%\nEpoch [190/200], Test Loss: 2.3156, Test Accuracy: 40.52%\nEpoch [191/200], Test Loss: 2.3104, Test Accuracy: 40.66%\nEpoch [192/200], Test Loss: 2.3094, Test Accuracy: 40.75%\nEpoch [193/200], Test Loss: 2.3101, Test Accuracy: 40.70%\nEpoch [194/200], Test Loss: 2.3118, Test Accuracy: 40.58%\nEpoch [195/200], Test Loss: 2.3129, Test Accuracy: 40.61%\nEpoch [196/200], Test Loss: 2.3139, Test Accuracy: 40.58%\nEpoch [197/200], Test Loss: 2.3128, Test Accuracy: 40.62%\nEpoch [198/200], Test Loss: 2.3132, Test Accuracy: 40.55%\nEpoch [199/200], Test Loss: 2.3151, Test Accuracy: 40.49%\nEpoch [200/200], Test Loss: 2.3107, Test Accuracy: 40.60%\n","output_type":"stream"}]},{"cell_type":"code","source":"!mkdir /kaggle/working/vanpth","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:40.038334Z","iopub.execute_input":"2023-05-27T17:20:40.039363Z","iopub.status.idle":"2023-05-27T17:20:41.023144Z","shell.execute_reply.started":"2023-05-27T17:20:40.039321Z","shell.execute_reply":"2023-05-27T17:20:41.021245Z"},"trusted":true},"execution_count":11,"outputs":[]},{"cell_type":"code","source":"# Save the model\nPATH = '/kaggle/working/vanpth/cifar_van5.pth'\ntorch.save(model.state_dict(), PATH)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:41.025522Z","iopub.execute_input":"2023-05-27T17:20:41.025922Z","iopub.status.idle":"2023-05-27T17:20:41.228574Z","shell.execute_reply.started":"2023-05-27T17:20:41.025860Z","shell.execute_reply":"2023-05-27T17:20:41.227582Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"markdown","source":"## 5. Test the network on the test data","metadata":{}},{"cell_type":"code","source":"# Evaluation on the test set\nmodel.eval()\ntest_loss = 0.0\ntest_total = 0\ntest_correct = 0\n\nwith torch.no_grad():\n    for images, labels in test_loader:\n        images = images.to(device)\n        labels = labels.to(device)\n\n        # Forward pass\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n\n        test_loss += loss.item()\n        _, predicted = torch.max(outputs.data, 1)\n        test_total += labels.size(0)\n        test_correct += (predicted == labels).sum().item()\n\ntest_acc = 100.0 * test_correct / test_total\ntest_losses.append(test_loss / len(test_loader))\ntest_accs.append(test_acc)\n\n# Print test accuracy for the current epoch\nprint(f\"Test Accuracy of the model on the {len(test_loader.dataset)} test images: {test_acc:.2f}%\")\n\n# Switch back to training mode\nmodel.train()\n","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:43:13.891315Z","iopub.execute_input":"2023-05-26T13:43:13.892389Z","iopub.status.idle":"2023-05-26T13:43:16.560384Z","shell.execute_reply.started":"2023-05-26T13:43:13.892336Z","shell.execute_reply":"2023-05-26T13:43:16.559196Z"},"trusted":true},"execution_count":22,"outputs":[{"name":"stdout","text":"Test Accuracy of the model on the 10000 test images: 53.50%\n","output_type":"stream"},{"execution_count":22,"output_type":"execute_result","data":{"text/plain":"VAN(\n  (patch_embed1): OverlapPatchEmbed(\n    (proj): Conv2d(3, 64, kernel_size=(7, 7), stride=(4, 4), padding=(3, 3))\n    (norm): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n  )\n  (block1): ModuleList(\n    (0-2): 3 x Block(\n      (norm1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (attn): Attention(\n        (proj_1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1))\n        (activation): GELU(approximate='none')\n        (spatial_gating_unit): LKA(\n          (conv0): Conv2d(64, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=64)\n          (conv_spatial): Conv2d(64, 64, kernel_size=(7, 7), stride=(1, 1), padding=(9, 9), dilation=(3, 3), groups=64)\n          (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1))\n        )\n        (proj_2): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1))\n      )\n      (drop_path): Identity()\n      (norm2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (mlp): Mlp(\n        (fc1): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1))\n        (dwconv): DWConv(\n          (dwconv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=256)\n        )\n        (act): GELU(approximate='none')\n        (fc2): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1))\n        (drop): Dropout(p=0.0, inplace=False)\n      )\n    )\n  )\n  (norm1): LayerNorm((64,), eps=1e-05, elementwise_affine=True)\n  (patch_embed2): OverlapPatchEmbed(\n    (proj): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n    (norm): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n  )\n  (block2): ModuleList(\n    (0-3): 4 x Block(\n      (norm1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (attn): Attention(\n        (proj_1): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1))\n        (activation): GELU(approximate='none')\n        (spatial_gating_unit): LKA(\n          (conv0): Conv2d(128, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=128)\n          (conv_spatial): Conv2d(128, 128, kernel_size=(7, 7), stride=(1, 1), padding=(9, 9), dilation=(3, 3), groups=128)\n          (conv1): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1))\n        )\n        (proj_2): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1))\n      )\n      (drop_path): Identity()\n      (norm2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (mlp): Mlp(\n        (fc1): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1))\n        (dwconv): DWConv(\n          (dwconv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=512)\n        )\n        (act): GELU(approximate='none')\n        (fc2): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))\n        (drop): Dropout(p=0.0, inplace=False)\n      )\n    )\n  )\n  (norm2): LayerNorm((128,), eps=1e-05, elementwise_affine=True)\n  (patch_embed3): OverlapPatchEmbed(\n    (proj): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n    (norm): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n  )\n  (block3): ModuleList(\n    (0-5): 6 x Block(\n      (norm1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (attn): Attention(\n        (proj_1): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))\n        (activation): GELU(approximate='none')\n        (spatial_gating_unit): LKA(\n          (conv0): Conv2d(256, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=256)\n          (conv_spatial): Conv2d(256, 256, kernel_size=(7, 7), stride=(1, 1), padding=(9, 9), dilation=(3, 3), groups=256)\n          (conv1): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))\n        )\n        (proj_2): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))\n      )\n      (drop_path): Identity()\n      (norm2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (mlp): Mlp(\n        (fc1): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1))\n        (dwconv): DWConv(\n          (dwconv): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=1024)\n        )\n        (act): GELU(approximate='none')\n        (fc2): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))\n        (drop): Dropout(p=0.0, inplace=False)\n      )\n    )\n  )\n  (norm3): LayerNorm((256,), eps=1e-05, elementwise_affine=True)\n  (patch_embed4): OverlapPatchEmbed(\n    (proj): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))\n    (norm): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n  )\n  (block4): ModuleList(\n    (0-2): 3 x Block(\n      (norm1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (attn): Attention(\n        (proj_1): Conv2d(512, 512, kernel_size=(1, 1), stride=(1, 1))\n        (activation): GELU(approximate='none')\n        (spatial_gating_unit): LKA(\n          (conv0): Conv2d(512, 512, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=512)\n          (conv_spatial): Conv2d(512, 512, kernel_size=(7, 7), stride=(1, 1), padding=(9, 9), dilation=(3, 3), groups=512)\n          (conv1): Conv2d(512, 512, kernel_size=(1, 1), stride=(1, 1))\n        )\n        (proj_2): Conv2d(512, 512, kernel_size=(1, 1), stride=(1, 1))\n      )\n      (drop_path): Identity()\n      (norm2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (mlp): Mlp(\n        (fc1): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1))\n        (dwconv): DWConv(\n          (dwconv): Conv2d(2048, 2048, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=2048)\n        )\n        (act): GELU(approximate='none')\n        (fc2): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1))\n        (drop): Dropout(p=0.0, inplace=False)\n      )\n    )\n  )\n  (norm4): LayerNorm((512,), eps=1e-05, elementwise_affine=True)\n  (head): Linear(in_features=512, out_features=100, bias=True)\n)"},"metadata":{}}]},{"cell_type":"code","source":"!mkdir /kaggle/working/van_figure","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:41.231544Z","iopub.execute_input":"2023-05-27T17:20:41.231957Z","iopub.status.idle":"2023-05-27T17:20:42.224596Z","shell.execute_reply.started":"2023-05-27T17:20:41.231920Z","shell.execute_reply":"2023-05-27T17:20:42.223312Z"},"trusted":true},"execution_count":13,"outputs":[]},{"cell_type":"code","source":"print(epoch)","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:43:43.358249Z","iopub.execute_input":"2023-05-26T13:43:43.359473Z","iopub.status.idle":"2023-05-26T13:43:43.365768Z","shell.execute_reply.started":"2023-05-26T13:43:43.359394Z","shell.execute_reply":"2023-05-26T13:43:43.364566Z"},"trusted":true},"execution_count":24,"outputs":[{"name":"stdout","text":"99\n","output_type":"stream"}]},{"cell_type":"code","source":"print(len(train_losses))\nprint(len(test_losses))","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:46:30.291634Z","iopub.execute_input":"2023-05-26T13:46:30.292021Z","iopub.status.idle":"2023-05-26T13:46:30.300093Z","shell.execute_reply.started":"2023-05-26T13:46:30.291986Z","shell.execute_reply":"2023-05-26T13:46:30.299061Z"},"trusted":true},"execution_count":40,"outputs":[{"name":"stdout","text":"100\n101\n","output_type":"stream"}]},{"cell_type":"code","source":"print(test_losses[100]==test_losses[99])","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:47:05.337320Z","iopub.execute_input":"2023-05-26T13:47:05.337997Z","iopub.status.idle":"2023-05-26T13:47:05.343266Z","shell.execute_reply.started":"2023-05-26T13:47:05.337955Z","shell.execute_reply":"2023-05-26T13:47:05.342172Z"},"trusted":true},"execution_count":42,"outputs":[{"name":"stdout","text":"True\n","output_type":"stream"}]},{"cell_type":"code","source":"del test_losses[100]","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:47:56.751219Z","iopub.execute_input":"2023-05-26T13:47:56.751595Z","iopub.status.idle":"2023-05-26T13:47:56.756496Z","shell.execute_reply.started":"2023-05-26T13:47:56.751565Z","shell.execute_reply":"2023-05-26T13:47:56.755347Z"},"trusted":true},"execution_count":43,"outputs":[]},{"cell_type":"code","source":"print(test_losses)","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:46:55.799389Z","iopub.execute_input":"2023-05-26T13:46:55.800320Z","iopub.status.idle":"2023-05-26T13:46:55.806629Z","shell.execute_reply.started":"2023-05-26T13:46:55.800286Z","shell.execute_reply":"2023-05-26T13:46:55.805595Z"},"trusted":true},"execution_count":41,"outputs":[{"name":"stdout","text":"[1.898841679096222, 1.8915505349636077, 1.909240472316742, 1.8914378046989442, 1.8978515148162842, 1.9176793158054353, 1.9208181142807006, 1.9221252858638764, 1.9220861852169038, 1.9404946088790893, 1.9400231897830964, 1.9469373881816865, 1.9682977497577667, 1.958009934425354, 1.9724945247173309, 1.993255114555359, 1.9870818734169007, 2.016400748491287, 2.0030752062797545, 2.009314924478531, 2.0174082815647125, 2.0328560709953307, 2.0666330635547636, 2.08784441947937, 2.084016728401184, 2.077292251586914, 2.12912917137146, 2.0960621774196624, 2.1204096257686613, 2.1424010336399077, 2.177342003583908, 2.184964990615845, 2.180627852678299, 2.1920836091041567, 2.188269430398941, 2.2204390823841096, 2.244407421350479, 2.2643589198589327, 2.278179383277893, 2.2828510642051696, 2.2801235914230347, 2.2947922348976135, 2.294178307056427, 2.324493944644928, 2.3395302534103393, 2.3382888793945313, 2.381002938747406, 2.3734839081764223, 2.393109691143036, 2.3939735651016236, 2.4223340153694153, 2.4297924757003786, 2.461668038368225, 2.485325539112091, 2.490145480632782, 2.4724807858467104, 2.5030290842056275, 2.511421763896942, 2.5138214468955993, 2.549779164791107, 2.5771641731262207, 2.5540016770362852, 2.5645659446716307, 2.584663438796997, 2.5886280655860903, 2.6170602083206176, 2.6338429689407348, 2.6310611724853517, 2.624928295612335, 2.6654372215270996, 2.660746443271637, 2.654928374290466, 2.6860516905784606, 2.6981189012527467, 2.7332393407821653, 2.7240770936012266, 2.7302329659461977, 2.7293259739875793, 2.730552649497986, 2.752121388912201, 2.773984599113464, 2.768827486038208, 2.7748189568519592, 2.7632110118865967, 2.8122876286506653, 2.82317134141922, 2.8091450452804567, 2.8109139442443847, 2.8421895146369933, 2.8742132902145388, 2.8660905003547668, 2.8558679103851317, 2.8648130536079406, 2.881428289413452, 2.8571041107177733, 2.879678738117218, 2.884675848484039, 2.9028538703918456, 2.9071486473083494, 2.924189305305481, 2.924189305305481]\n","output_type":"stream"}]},{"cell_type":"code","source":"print(len(train_accs))","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:48:19.041395Z","iopub.execute_input":"2023-05-26T13:48:19.041918Z","iopub.status.idle":"2023-05-26T13:48:19.048743Z","shell.execute_reply.started":"2023-05-26T13:48:19.041875Z","shell.execute_reply":"2023-05-26T13:48:19.047491Z"},"trusted":true},"execution_count":44,"outputs":[{"name":"stdout","text":"100\n","output_type":"stream"}]},{"cell_type":"code","source":"print(len(test_accs))","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:48:41.448535Z","iopub.execute_input":"2023-05-26T13:48:41.448893Z","iopub.status.idle":"2023-05-26T13:48:41.454094Z","shell.execute_reply.started":"2023-05-26T13:48:41.448865Z","shell.execute_reply":"2023-05-26T13:48:41.452908Z"},"trusted":true},"execution_count":49,"outputs":[{"name":"stdout","text":"100\n","output_type":"stream"}]},{"cell_type":"code","source":"test_accs.pop()","metadata":{"execution":{"iopub.status.busy":"2023-05-26T13:48:40.075825Z","iopub.execute_input":"2023-05-26T13:48:40.076873Z","iopub.status.idle":"2023-05-26T13:48:40.084233Z","shell.execute_reply.started":"2023-05-26T13:48:40.076836Z","shell.execute_reply":"2023-05-26T13:48:40.082825Z"},"trusted":true},"execution_count":48,"outputs":[{"execution_count":48,"output_type":"execute_result","data":{"text/plain":"53.5"},"metadata":{}}]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n# Plot the training and testing losses\nplt.figure(figsize=(12, 5))\nplt.plot(range(1, num_epochs+1), train_losses, label='Training Loss')\nplt.plot(range(1, num_epochs+1  ), test_losses, label='Testing Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.title('Training and Testing Loss')\nplt.legend()\nplt.savefig(\"/kaggle/working/van_figure/5_25_50epochs_losses.png\")\nplt.show()\n\n# Plot the training and testing acc\nplt.figure(figsize=(12, 5))\nplt.plot(range(1, num_epochs+1), train_accs, label='Training Accuracy')\nplt.plot(range(1, num_epochs +1 ), test_accs, label='Testing Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.title('Training and Testing Accuracy')\nplt.legend()\nplt.savefig(\"/kaggle/working/van_figure/5_25_50epochs_accs.png\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:42.227065Z","iopub.execute_input":"2023-05-27T17:20:42.227827Z","iopub.status.idle":"2023-05-27T17:20:43.190671Z","shell.execute_reply.started":"2023-05-27T17:20:42.227786Z","shell.execute_reply":"2023-05-27T17:20:43.189781Z"},"trusted":true},"execution_count":14,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 1200x500 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAA/IAAAHUCAYAAACZCBM6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC5DElEQVR4nOzdd3gUVdvH8e9uem8EEkhCJxB6b1KkCyioCCqiKBYQX3tDHysq6iOCFTtYARVQHpUiHaX33gmhJLSQQiB19/1jspssCRBCYJPw+1zXXjN75szMmQ3v43vPOec+JqvVakVEREREREREygSzsxsgIiIiIiIiIkWnQF5ERERERESkDFEgLyIiIiIiIlKGKJAXERERERERKUMUyIuIiIiIiIiUIQrkRURERERERMoQBfIiIiIiIiIiZYgCeREREREREZEyRIG8iIiIiIiISBmiQF5ERMock8lUpM+iRYsu6z6vvvoqJpOpWOcuWrSoRNpQ2g0dOpRq1aqd9/ikSZOK9Le60DUuxbJly3j11VdJSkoqcKxz58507ty5RO5zqTp37kyDBg2ccm8RESl/XJ3dABERkUu1fPlyh++jR49m4cKFLFiwwKE8Jibmsu5z//3306tXr2Kd26xZM5YvX37ZbSjr+vTpU+Dv1bZtWwYMGMBTTz1lL/Pw8CiR+y1btozXXnuNoUOHEhgY6HDs008/LZF7iIiIOJsCeRERKXPatGnj8D00NBSz2Vyg/FxnzpzB29u7yPeJiIggIiKiWG309/e/aHuuBaGhoYSGhhYor1Sp0lX/fa71lyoiIlJ+aGi9iIiUS7ahzEuWLKFdu3Z4e3tz3333ATB16lR69OhBeHg4Xl5e1KtXj+eff560tDSHaxQ2tL5atWr07duX2bNn06xZM7y8vKhbty7ffPONQ73ChtYPHToUX19f9uzZQ+/evfH19SUyMpKnnnqKjIwMh/MPHTrEgAED8PPzIzAwkMGDB7N69WpMJhOTJk264LMfP36chx9+mJiYGHx9falYsSJdunRh6dKlDvViY2MxmUy89957vP/++1SvXh1fX1/atm3LihUrClx30qRJREdH4+HhQb169fjuu+8u2I5LsXv3bu68804qVqxov/4nn3ziUMdisfDGG28QHR2Nl5cXgYGBNGrUiA8++AAw/l7PPPMMANWrVy8wxeLcofWX+vxffvklderUwcPDg5iYGH766aeLTi24FBaLhXfffZe6devi4eFBxYoVufvuuzl06JBDvfXr19O3b1/7b1W5cmX69OnjUO+XX36hdevWBAQE4O3tTY0aNez//kVEpOxTj7yIiJRb8fHx3HXXXTz77LO89dZbmM3G++vdu3fTu3dvHn/8cXx8fNixYwfvvPMOq1atKjA8vzAbN27kqaee4vnnn6dSpUp89dVXDBs2jFq1atGxY8cLnpuVlcVNN93EsGHDeOqpp1iyZAmjR48mICCAl19+GYC0tDSuv/56EhMTeeedd6hVqxazZ89m0KBBRXruxMREAF555RXCwsI4ffo0M2bMoHPnzsyfP7/APPFPPvmEunXrMn78eABeeuklevfuzf79+wkICACMIP7ee++lX79+jB07luTkZF599VUyMjLsv2txbdu2jXbt2hEVFcXYsWMJCwtjzpw5PProo5w4cYJXXnkFgHfffZdXX32V//znP3Ts2JGsrCx27Nhhnw9///33k5iYyEcffcT06dMJDw8HLt4TX5Tn/+KLL3jooYe49dZbGTduHMnJybz22msFXsBcjhEjRvDFF1/wyCOP0LdvX2JjY3nppZdYtGgR69ato0KFCqSlpdG9e3eqV6/OJ598QqVKlUhISGDhwoWkpqYCxtSTQYMGMWjQIF599VU8PT05cOBAkf5ti4hIGWEVEREp4+655x6rj4+PQ1mnTp2sgHX+/PkXPNdisVizsrKsixcvtgLWjRs32o+98sor1nP/U1m1alWrp6en9cCBA/ays2fPWoODg60PPfSQvWzhwoVWwLpw4UKHdgLWn3/+2eGavXv3tkZHR9u/f/LJJ1bAOmvWLId6Dz30kBWwTpw48YLPdK7s7GxrVlaWtWvXrtabb77ZXr5//34rYG3YsKE1OzvbXr5q1SorYJ08ebLVarVac3JyrJUrV7Y2a9bMarFY7PViY2Otbm5u1qpVq15SewDryJEj7d979uxpjYiIsCYnJzvUe+SRR6yenp7WxMREq9Vqtfbt29fapEmTC177v//9rxWw7t+/v8CxTp06WTt16mT/finPHxYWZm3durXD9Q4cOFDk5+/UqZO1fv365z2+fft2K2B9+OGHHcpXrlxpBawvvPCC1Wq1WtesWWMFrL/99tt5r/Xee+9ZAWtSUtJF2yUiImWThtaLiEi5FRQURJcuXQqU79u3jzvvvJOwsDBcXFxwc3OjU6dOAGzfvv2i123SpAlRUVH2756entSpU4cDBw5c9FyTycSNN97oUNaoUSOHcxcvXoyfn1+BRHt33HHHRa9v89lnn9GsWTM8PT1xdXXFzc2N+fPnF/p8ffr0wcXFxaE9gL1NO3fu5MiRI9x5550OUw2qVq1Ku3btitymwqSnpzN//nxuvvlmvL29yc7Otn969+5Nenq6fZh7q1at2LhxIw8//DBz5swhJSXlsu5tU5TnT0hIYODAgQ7nRUVF0b59+xJpw8KFCwFj+kV+rVq1ol69esyfPx+AWrVqERQUxHPPPcdnn33Gtm3bClyrZcuWAAwcOJCff/6Zw4cPl0gbRUSk9FAgLyIi5ZZtaHV+p0+fpkOHDqxcuZI33niDRYsWsXr1aqZPnw7A2bNnL3rdkJCQAmUeHh5FOtfb2xtPT88C56anp9u/nzx5kkqVKhU4t7Cywrz//vuMGDGC1q1bM23aNFasWMHq1avp1atXoW0893lsGeRtdU+ePAlAWFhYgXMLK7sUJ0+eJDs7m48++gg3NzeHT+/evQE4ceIEAKNGjeK9995jxYoV3HDDDYSEhNC1a1fWrFlzWW0o6vNfzt/kYmz3KOzfbOXKle3HAwICWLx4MU2aNOGFF16gfv36VK5cmVdeeYWsrCwAOnbsyG+//UZ2djZ33303ERERNGjQgMmTJ5dIW0VExPk0R15ERMqtwtaAX7BgAUeOHGHRokX2Xnig0HXHnSUkJIRVq1YVKE9ISCjS+T/88AOdO3dmwoQJDuW2OdTFac/57l/UNp1PUFAQLi4uDBkyhJEjRxZap3r16gC4urry5JNP8uSTT5KUlMS8efN44YUX6NmzJwcPHrykFQkuhe35jx49WuDY5T7/ufeIj48vsFLCkSNHqFChgv17w4YNmTJlClarlU2bNjFp0iRef/11vLy8eP755wHo168f/fr1IyMjgxUrVjBmzBjuvPNOqlWrRtu2bUukzSIi4jzqkRcRkWuKLbg/d93yzz//3BnNKVSnTp1ITU1l1qxZDuVTpkwp0vkmk6nA823atKnAeu5FFR0dTXh4OJMnT8ZqtdrLDxw4wLJly4p1TRtvb2+uv/561q9fT6NGjWjRokWBT2EjIAIDAxkwYAAjR44kMTGR2NhYoGBvekmIjo4mLCyMn3/+2aE8Li7usp/fxjYF5IcffnAoX716Ndu3b6dr164FzjGZTDRu3Jhx48YRGBjIunXrCtTx8PCgU6dOvPPOO4CR8V5ERMo+9ciLiMg1pV27dgQFBTF8+HBeeeUV3Nzc+PHHH9m4caOzm2Z3zz33MG7cOO666y7eeOMNatWqxaxZs5gzZw7ARbPE9+3bl9GjR/PKK6/QqVMndu7cyeuvv0716tXJzs6+5PaYzWZGjx7N/fffz80338wDDzxAUlISr7766mUPrQf44IMPuO666+jQoQMjRoygWrVqpKamsmfPHv73v//Zs63feOONNGjQgBYtWhAaGsqBAwcYP348VatWpXbt2oDRW2275j333IObmxvR0dH4+fkVu31ms5nXXnuNhx56iAEDBnDfffeRlJTEa6+9Rnh4eJGz9qekpPDrr78WKA8NDaVTp048+OCDfPTRR5jNZm644QZ71vrIyEieeOIJAP744w8+/fRT+vfvT40aNbBarUyfPp2kpCS6d+8OwMsvv8yhQ4fo2rUrERERJCUl8cEHHzjkghARkbJNgbyIiFxTQkJC+PPPP3nqqae466678PHxoV+/fkydOpVmzZo5u3kA+Pj4sGDBAh5//HGeffZZTCYTPXr04NNPP6V3794EBgZe8PwXX3yRM2fO8PXXX/Puu+8SExPDZ599xowZMxzWtb8Uw4YNA+Cdd97hlltuoVq1arzwwgssXry42Ne0iYmJYd26dYwePZr//Oc/HDt2jMDAQGrXrm2fJw9w/fXXM23aNL766itSUlIICwuje/fuvPTSS7i5uQHGWvGjRo3i22+/5csvv8RisbBw4cICS+5dqgcffBCTycS7777LzTffTLVq1Xj++ef5/fffiYuLK9I1Dh48yG233VagvFOnTixatIgJEyZQs2ZNvv76az755BMCAgLo1asXY8aMsY9KqF27NoGBgbz77rscOXIEd3d3oqOjmTRpEvfccw8ArVu3Zs2aNTz33HMcP36cwMBAWrRowYIFC6hfv/5l/Q4iIlI6mKz5x8iJiIhIqfXWW2/xn//8h7i4uALzqOXqS0pKok6dOvTv358vvvjC2c0REZFriHrkRURESqGPP/4YgLp165KVlcWCBQv48MMPueuuuxTEO0FCQgJvvvkm119/PSEhIRw4cIBx48aRmprKY4895uzmiYjINUaBvIiISCnk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THDuWvInTmuOvIiIiIiISHmlQL4sM7tAUFVjP3G/fWi9euRFRERERETKLwXyZV2+efIhSnYnIiIiIiJS7imQL+ts8+RP7Sc8wAuAuMQzWK1WJzZKRERERERErhQF8mVdvh75mhV9cDGbSD6bRUJKulObJSIiIiIiIleGAvmyLt9a8h6uLtQM9QFgR3yqExslIiIiIiIiV4oC+bLunLXk64b5A7AjQYG8iIiIiIhIeaRAvqyzBfLpSXD2FNFhfgDsSEhxWpNERERERETkylEgX9a5+4BPRWP/VCz1wnMDeQ2tFxERERERKZcUyJcH+ebJ24bW7z1+msxsixMbJSIiIiIiIleCAvnyIN88+fAAT/w8Xcm2WNl7/LRTmyUiIiIiIiIlT4F8eZBvLXmTyUQ9e8I7zZMXEREREREpbxTIlwfnZq7XPHkREREREZFyS4F8eWCfIx8LaAk6ERERERGR8kyBfHlg65FPOQTZmVqCTkREREREpBxTIF8e+FYCVy+wWiD5oD2QP5qSwam0TCc3TkREREREREqSAvnywGTKN09+P74erkQFewMaXi8iIiIiIlLeKJAvL/KtJQ9oeL2IiIiIiEg5pUC+vDgnc329MGWuFxERERERKY8UyJcX9rXkYwGoG56buf6oAnkREREREZHyxKmB/IQJE2jUqBH+/v74+/vTtm1bZs2add76Q4cOxWQyFfjUr1/fXmfSpEmF1klPT78aj+Q8564ln9sjvyshlRyL1TltEhERERERkRLn1EA+IiKCt99+mzVr1rBmzRq6dOlCv3792Lp1a6H1P/jgA+Lj4+2fgwcPEhwczG233eZQz9/f36FefHw8np6eV+ORnCf/HHmrlaohPni6mTmblUNc4hnntk1ERERERERKjKszb37jjTc6fH/zzTeZMGECK1ascOhltwkICCAgIMD+/bfffuPUqVPce++9DvVMJhNhYWFXptGlVWAUYIKsNEg7jotvRepU8mPToWR2JqRQvYKPs1soIiIiIiIiJaDUzJHPyclhypQppKWl0bZt2yKd8/XXX9OtWzeqVq3qUH769GmqVq1KREQEffv2Zf369Re8TkZGBikpKQ6fMsfVA/yrGPvnDK/froR3IiIiIiIi5YbTA/nNmzfj6+uLh4cHw4cPZ8aMGcTExFz0vPj4eGbNmsX999/vUF63bl0mTZrEzJkzmTx5Mp6enrRv357du3ef91pjxoyx9/YHBAQQGRl52c/lFLZ58vYl6HIT3mkJOhERERERkXLD6YF8dHQ0GzZsYMWKFYwYMYJ77rmHbdu2XfS8SZMmERgYSP/+/R3K27Rpw1133UXjxo3p0KEDP//8M3Xq1OGjjz4677VGjRpFcnKy/XPw4MHLfSznCK5mbM9dgi5BPfIiIiIiIiLlhVPnyAO4u7tTq1YtAFq0aMHq1av54IMP+Pzzz897jtVq5ZtvvmHIkCG4u7tf8Ppms5mWLVtesEfew8MDDw+P4j1AaWLPXG/rkTcC+bjEM6SmZ+Hn6eakhomIiIiIiEhJcXqP/LmsVisZGRkXrLN48WL27NnDsGHDinS9DRs2EB4eXlJNLL2C8mWuB0J8Paga4o3VCsv3nnRiw0RERERERKSkODWQf+GFF1i6dCmxsbFs3ryZF198kUWLFjF48GDAGPJ+9913Fzjv66+/pnXr1jRo0KDAsddee405c+awb98+NmzYwLBhw9iwYQPDhw+/4s/jdCHGyAaO7wCrsXb89dEVAVi487izWiUiIiIiIiIlyKlD648ePcqQIUOIj48nICCARo0aMXv2bLp37w4YCe3i4uIczklOTmbatGl88MEHhV4zKSmJBx98kISEBAICAmjatClLliyhVatWV/x5nK5iDLi4Q3oSJO6DkJp0jg5l0rJYFu08htVqxWQyObuVIiIiIiIichlMVmtu163YpaSkEBAQQHJyMv7+/s5uzqX54no4sg5u/RoaDiA9K4cmr88lPcvC7Mc7UDesjD2PiIiIiIjINeBS4tBSN0deLlOVZsb2yHoAPN1caFezAgALd2h4vYiIiIiISFmnQL68qewYyANcHx0KwMKdx5zRIhERERERESlBCuTLm8pNje2RDWDJAaBzbsK7tQdOkXw2y0kNExERERERkZKgQL68CY0GNx/ISoMTuwCIDPamVkVfcixW/tl9wskNFBERERERkcuhQL68MbtAeGNjX8PrRUREREREyh0F8uWRbXj94XX2Itt68ot2HsNi0UIFIiIiIiIiZZUC+fLInrk+L5BvUS0YH3cXTpzOZMuRZCc1TERERERERC6XAvnyyNYjn7AFsjMBcHc1c11tLUMnIiIiIiJS1imQL4+Ca4BnAORkwLFt9mLb8HrNkxcRERERESm7FMiXRyZTvmXo8hLe2Zah23goiZOnM5zRMhEREREREblMCuTLK3sgnzdPPizAk3rh/litsGS3hteLiIiIiIiURQrky6vKuQnvDq93KO6cuwzdkl1aT15ERERERKQsUiBfXtky1x/bBlln7cWd6tgC+eNahk5ERERERKQMUiBfXvlXAZ9QsOZAwmZ7cbOoIHw9XDmZlsnWIylObKCIiIiIiIgUhwL58spkyhteny/hnburmbY1QwBYvEvZ60VERERERMoaBfLlmW14/eF1DsV5w+s1T15ERERERKSsUSBfnhWSuR7yAvm1cadISc+62q0SERERERGRy6BAvjyzDa0/sRvOJtmLI4O9qRHqQ47FyrI96pUXEREREREpSxTIl2e+oVChDmCFfQsdDtl65Rfv0nryIiIiIiIiZYkC+fKudg9ju2uOQ3FHWyC/8zhWq5ahExERERERKSsUyJd3dXoZ291zwZJjL25TPQR3VzNHktPZc+y0kxonIiIiIiIil0qBfHkX1QY8AuDMSTi81l7s5e5C6+rBgIbXi4iIiIiIlCUK5Ms7Fzeo1dXY3zXb4ZDmyYuIiIiIiJQ9CuSvBbbh9bvmOhR3jjYC+ZX7EzmbmXPuWSIiIiIiIlIKKZC/FtTqBiYzHN0MyYfsxTVDfakc4ElmtoUV+086sYEiIiIiIiJSVArkrwU+IRDR0tjPl73eZDLRKbdXfsH2Y85omYiIiIiIiFwiBfLXijo9je05y9D1qB8GwKwt8WTnWK52q0REREREROQSKZC/Vtjmye9fDJln7MXX1apAsI87J05nsmyvhteLiIiIiIiUdgrkrxUVYyAgErLTIXapvdjNxUzvhkav/O8bjjirdSIiIiIiIlJECuSvFSZTvuH1jsvQ9WtSBYA5WxNIz1L2ehERERERkdJMgfy1pHa+efJWq724eVQQVQK9OJ2RzYIdSnonIiIiIiJSmimQv5ZU7wCuXpByGBI224vNZhM3Nq4MwO8bDjurdSIiIiIiIlIECuSvJW5eUKursb9pqsOhfk2MQH7hjuMkn8262i0TERERERGRIlIgf61pOsTYbvgJsjPsxXXD/KhTyZfMHAtztiQ4qXEiIiIiIiJyMQrkrzW1uoF/FTibCNv/Zy82mUz2pHe/b9TwehERERERkdJKgfy1xsU1r1d+7SSHQzflzpNftvckx1LSr3LDREREREREpCgUyF+Lmt4FJrOxnvyJPfbiyGBvmkUFYrXC/zbFO7GBIiIiIiIicj5ODeQnTJhAo0aN8Pf3x9/fn7Zt2zJr1qzz1l+0aBEmk6nAZ8eOHQ71pk2bRkxMDB4eHsTExDBjxowr/ShlS2Ak1Opu7K/71uGQbXj9TGWvFxERERERKZWcGshHRETw9ttvs2bNGtasWUOXLl3o168fW7duveB5O3fuJD4+3v6pXbu2/djy5csZNGgQQ4YMYePGjQwZMoSBAweycuXKK/04ZUvzocZ2w48OSe96NwzHZIKNh5I5dOqMc9omIiIiIiIi52WyWq1WZzciv+DgYP773/8ybNiwAscWLVrE9ddfz6lTpwgMDCz0/EGDBpGSkuLQs9+rVy+CgoKYPHlykdqQkpJCQEAAycnJ+Pv7F+s5Sr2cbBjfAFLjYcBEaHCL/dDAz5ezan8i/+lTj/s71HBiI0VERERERK4NlxKHlpo58jk5OUyZMoW0tDTatm17wbpNmzYlPDycrl27snDhQodjy5cvp0ePHg5lPXv2ZNmyZee9XkZGBikpKQ6fci9/0rtzhtf3bhAGwCwtQyciIiIiIlLqOD2Q37x5M76+vnh4eDB8+HBmzJhBTExMoXXDw8P54osvmDZtGtOnTyc6OpquXbuyZMkSe52EhAQqVarkcF6lSpVISDh/UDpmzBgCAgLsn8jIyJJ5uNKu2RDABPsWQeI+e3GvBuEArD1wioRkZa8XEREREREpTZweyEdHR7NhwwZWrFjBiBEjuOeee9i2bdt56z7wwAM0a9aMtm3b8umnn9KnTx/ee+89h3omk8nhu9VqLVCW36hRo0hOTrZ/Dh48ePkPVhYERhnrygNs+MleHBbgSfOqQQDM3qLs9SIiIiIiIqWJ0wN5d3d3atWqRYsWLRgzZgyNGzfmgw8+KPL5bdq0Yffu3fbvYWFhBXrfjx07VqCXPj8PDw975nzb55rR4FZju2+RQ/ENucPr/9LwehERERERkVLF6YH8uaxWKxkZGRevmGv9+vWEh4fbv7dt25a///7boc7cuXNp165dibWxXKnW3tgeWQ8Zp+3FNzQ0ftPVsYkcS9XwehERERERkdLC1Zk3f+GFF7jhhhuIjIwkNTWVKVOmsGjRImbPng0YQ94PHz7Md999B8D48eOpVq0a9evXJzMzkx9++IFp06Yxbdo0+zUfe+wxOnbsyDvvvEO/fv34/fffmTdvHv/8849TnrHUC4yCgChIjoODK6FWVwCqBHrRODKQjQeTmLP1KEPaVHVyQ0VERERERASc3CN/9OhRhgwZYk9at3LlSmbPnk337t0BiI+PJy4uzl4/MzOTp59+mkaNGtGhQwf++ecf/vzzT265JW/ptHbt2jFlyhQmTpxIo0aNmDRpElOnTqV169ZX/fnKDFuv/IF/HYpt2es1T15ERERERKT0KHXryJcG18Q68vmt+x5mPgKRbWDYHHtx3MkzdPzvQlzMJla90JUQXw8nNlJERERERKT8KpPryIsT2XrkD6+FzDP24qgQb+pX9ifHYuXvbUed1DgRERERERHJT4G8QFB18KsMliw4tNrhUO/cpHfKXi8iIiIiIlI6KJAXMJnOO0/etgzdsj0nOJ5a9NUERERERERE5MpQIC+GatcZ21jHQL5GqC9NowLJtlj5fnns1W+XiIiIiIiIOFAgL4aquYH8odWQ5bhu/P3X1QDg+xUHOJuZc7VbJiIiIiIiIvkokBdDSE3wrQQ5GUbSu3x61q9ERJAXp85kMW3dISc1UERERERERECBvNiYTFA1d5587D8Oh1xdzNzXvjoA3/yzH4tFKxaKiIiIiIg4iwJ5yWNPePdPgUMDW0bi5+nKvhNpzN9x7Co3TERERERERGwUyEse2zz5g6shO9PhkK+HK3e2jgLgq6X7rnbLREREREREJJcCeckTGg3eFSD7LBxZV+Dw0HbVcDWbWLk/kc2Hkp3QQBEREREREVEgL3lMJqjaztiPLTi8PjzAi76NwgH4Ur3yIiIiIiIiTqFAXhzZ1pPfv7jQw/d3MJai+3NzPIeTzl6tVomIiIiIiEguBfLiqFY3MJlh/xI4uKrA4QZVAmhTI5gci5Wpqw86oYEiIiIiIiLXNgXy4iikJjQZbOzPeRGsBZeau6OVkfTu1zUHydFSdCIiIiIiIleVAnkp6PoXwc0bDq2Cbb8VONyzfhj+nq4cSU5n2d4TV799IiIiIiIi1zAF8lKQfzi0f8zYn/cqZGc4HPZ0c6F/0yoAGl4vIiIiIiJylSmQl8K1+z/wDYNTsbD6qwKHB7aIBGDu1qMknckscFxERERERESuDAXyUjh3H+jyorG/+F04k+hwuEGVAGLC/cnMsfD7hiNOaKCIiIiIiMi1SYG8nF+TwVAxBtKTYOnYAocHtogANLxeRERERETkalIgL+dndoEeo439lZ9DmmNiu35NquDuYmZbfApbDic7oYEiIiIiIiLXHgXycmG1ukF4E7BkwdYZDoeCfNzpUb8SAL+sUa+8iIiIiIjI1aBAXi6u4W3GdvOvBQ7Zkt79tuEI6Vk5V7NVIiIiIiIi1yQF8nJxDW4BTHBwBSTFORxqX6sCVQK9SD6bxZytCc5pn4iIiIiIyDVEgbxcnH9lqHadsb9lmsMhF7OJAc2NpHc/row790wREREREREpYQrkpWgaDjC2hQyvv6NVFK5mE6v2J7I9PuUqN0xEREREROTaokBeiqbeTWB2g6Nb4Nh2h0NhAZ70bBAGwLfLYp3QOBERERERkWuHAnkpGu9gqN3d2C+kV35ou2oA/LbhMElnMq9iw0RERERERK4tCuSl6Brcamy3/ApWq8OhFlWDiAn3Jz3LwtTVWopORERERETkSlEgL0UXfQO4+cCpWDi81uGQyWSy98p/v+IAORZrwfNFRERERETksimQl6Jz94G6fYz9zb8UOHxTk8oEebtx6NRZ5m8/epUbJyIiIiIicm1QIC+Xxpa9fst0yMl2OOTp5sKgllEAfLs89io3TERERERE5NqgQF4uTc0u4BUMacdg/6ICh+9qE4XZBP/uOcnuo6lXv30iIiIiIiLlnAJ5uTQubnm98msnFTgcEeRN95hKAEzSUnQiIiIiIiIlToG8XLoW9xnbHX9BypECh4e2qw7AL2sPkZCcfjVbJiIiIiIiUu4pkJdLV7EeRLUDaw6s+77A4TY1gmlVLZjMbAsfL9zthAaKiIiIiIiUXwrkpXhsvfJrJxVIemcymXiqRx0Apq4+yMHEM1e5cSIiIiIiIuWXAnkpnpibwLsCpB6BXbMLHG5dI4QOtSuQlWPlw/nqlRcRERERESkpxQrkDx48yKFDh+zfV61axeOPP84XX3xRYg2TUs7VA5reZeyv+abQKk92N3rlp607xL7jp69Wy0RERERERMq1YgXyd955JwsXLgQgISGB7t27s2rVKl544QVef/31Il9nwoQJNGrUCH9/f/z9/Wnbti2zZs06b/3p06fTvXt3QkND7fXnzJnjUGfSpEmYTKYCn/R0JV0rcc2HAibYOx8S9xU43DQqiG71KmKxwvh56pUXEREREREpCcUK5Lds2UKrVq0A+Pnnn2nQoAHLli3jp59+YtKkSUW+TkREBG+//TZr1qxhzZo1dOnShX79+rF169ZC6y9ZsoTu3bvz119/sXbtWq6//npuvPFG1q9f71DP39+f+Ph4h4+np2dxHlUuJLg61Opq7K+ZWGiVJ3J75f+36Qg7ElKuVstERERERETKrWIF8llZWXh4eAAwb948brrpJgDq1q1LfHx8ka9z44030rt3b+rUqUOdOnV488038fX1ZcWKFYXWHz9+PM8++ywtW7akdu3avPXWW9SuXZv//e9/DvVMJhNhYWEOH7lCWgwztut/gOyMAofrVw6gT8NwrFZ4f+6uq9w4ERERERGR8qdYgXz9+vX57LPPWLp0KX///Te9evUC4MiRI4SEhBSrITk5OUyZMoW0tDTatm1bpHMsFgupqakEBwc7lJ8+fZqqVasSERFB3759C/TYnysjI4OUlBSHjxRR7R7gXwXOJsK23wut8kT32phNMHfbURbtPHaVGygiIiIiIlK+FCuQf+edd/j888/p3Lkzd9xxB40bNwZg5syZ9iH3RbV582Z8fX3x8PBg+PDhzJgxg5iYmCKdO3bsWNLS0hg4cKC9rG7dukyaNImZM2cyefJkPD09ad++Pbt3n3+O9pgxYwgICLB/IiMjL+kZrmkurrlz5Tlv0rtaFf24p101AJ6ftpnks1lXp20iIiIiIiLlkMlqtVqLc2JOTg4pKSkEBQXZy2JjY/H29qZixYpFvk5mZiZxcXEkJSUxbdo0vvrqKxYvXnzRYH7y5Mncf//9/P7773Tr1u289SwWC82aNaNjx458+OGHhdbJyMggIyNvWHhKSgqRkZEkJyfj7+9f5Ge5ZqUmwPsxYM2BEcugUv0CVc5m5tD7w6XsP5HGrc0iGDuwsRMaKiIiIiIiUjqlpKQQEBBQpDi0WD3yZ8+eJSMjwx7EHzhwgPHjx7Nz585LCuIB3N3dqVWrFi1atGDMmDE0btyYDz744ILnTJ06lWHDhvHzzz9fMIgHMJvNtGzZ8oI98h4eHvbM+baPXAK/MKjbx9g/T6+8l7sL793WCJPJWI7u721Hr2IDRUREREREyo9iBfL9+vXju+++AyApKYnWrVszduxY+vfvz4QJEy6rQVar1aF3/FyTJ09m6NCh/PTTT/Tp06dI19uwYQPh4eGX1S65iJa5Se82ToWMwteMb141mAc61ADghRmbOZWWebVaJyIiIiIiUm4UK5Bft24dHTp0AODXX3+lUqVKHDhwgO++++68w9cL88ILL7B06VJiY2PZvHkzL774IosWLWLw4MEAjBo1irvvvttef/Lkydx9992MHTuWNm3akJCQQEJCAsnJyfY6r732GnPmzGHfvn1s2LCBYcOGsWHDBoYPH16cR5Wiqt4JQmpBZips/uW81Z7sXodaFX05nprBKzMLX2ZQREREREREzq9YgfyZM2fw8/MDYO7cudxyyy2YzWbatGnDgQMHinydo0ePMmTIEKKjo+natSsrV65k9uzZdO/eHYD4+Hji4uLs9T///HOys7MZOXIk4eHh9s9jjz1mr5OUlMSDDz5IvXr16NGjB4cPH2bJkiWXnIRPLpHJBM3vNfbXfA3nSb3g6ebC2Nsa42I2MXPjEQ2xFxERERERuUTFSnbXqFEj7r//fm6++WYaNGjA7Nmzadu2LWvXrqVPnz4kJCRcibZeNZeSZEDyOZMI79eD7HS4fz5EtDhv1bdn7eCzxXupEujFvCc74eXuchUbKiIiIiIiUrpc8WR3L7/8Mk8//TTVqlWjVatW9nXf586dS9OmTYtzSSkPvIOh/i3G/uqvL1j10a61qBLoxeGks3yycM9VaJyIiIiIiEj5UKxAfsCAAcTFxbFmzRrmzJljL+/atSvjxo0rscZJGdTiPmO7dbrRQ38e3u6uvNTXWGLwiyX72He88AR5IiIiIiIi4qhYgTxAWFgYTZs25ciRIxw+fBiAVq1aUbdu3RJrnJRBES0grKExvH7dtxes2rN+JTpHh5KZY+GVmVspxiwPERERERGRa06xAnmLxcLrr79OQEAAVatWJSoqisDAQEaPHo3FYinpNkpZYjJBi9yl6Oa9Cl/3gE0/Q3bBJQVNJhOv3VQfd1czS3ef4K/NZTu3goiIiIiIyNVQrED+xRdf5OOPP+btt99m/fr1rFu3jrfeeouPPvqIl156qaTbKGVNk8HQdAiYXeHgSpj+AIyrD8s+LlC1aogPIzrVBGD0H9s4nZF9tVsrIiIiIiJSphQra33lypX57LPPuOmmmxzKf//9dx5++GH7UPuySlnrS0jqUWN4/ZqJkHrEKLtjKkT3cqiWnpVD93GLOZh4lpsaV2bcoCa4mE1OaLCIiIiIiIhzXPGs9YmJiYXOha9bty6JiedPcCbXGL9K0OlZeHwztHrQKJv9fIFh9p5uLrx9SyNcc9eWf3HGZiwWzZcXEREREREpTLEC+caNG/PxxwWHSX/88cc0atToshsl5YyLK3R9GXzD4NR+WF7w3077WhUYf3sTzCaYsvogr/+xTcnvRERERERECuFanJPeffdd+vTpw7x582jbti0mk4lly5Zx8OBB/vrrr5Juo5QHHn7Q/XWY8SAseQ8a3Q4BVRyq9G1UmYwsC0/9spFJy2LxcDPzfK+6mEwaZi8iIiIiImJTrB75Tp06sWvXLm6++WaSkpJITEzklltuYevWrUycOLGk2yjlRaOBENkGss7A34UnRby1eQRv3twAgM8X7+PD+XuuZgtFRERERERKvWIluzufjRs30qxZM3Jyckrqkk6hZHdXUPxG+LwTYIWhf0K16wqt9vU/+xn9xzYARt1Ql4dyM9uLiIiIiIiUR1c82Z1IsYU3hhb3Gvt/PQs5hS83N+y66jzTMxqAMbN28O2y2KvUQBERERERkdJNgbxcfV1eAq8gOLYVtv9+3mojr6/F/3WpBcArM7cydXXc1WqhiIiIiIhIqaVAXq4+72BocZ+xv3naBas+2b0O919XHYDnp2/mt/WHr3TrRERERERESrVLylp/yy23XPB4UlLS5bRFriUNboWlY2HP35CeDJ4BhVYzmUy82Kce6dk5/LAijqd/2UjVEG+aRgVd5QaLiIiIiIiUDpfUIx8QEHDBT9WqVbn77ruvVFulPKkYA6F1IScTdvx5waomk4nXb2pA74ZhZFusPDplPSnpWVepoSIiIiIiIqVLiWatLy+Utf4qWfwuLHwTanWDuy48xB4gJT2L3h8s5dCps/RtFM5HdzTVGvMiIiIiIlIuKGu9lA31c6dq7F0IaScvWt3f040P72iKi9nEH5vi+XnNwSvcQBERERERkdJHgbw4T4VaxnJ01pwLZq/Pr1lUEE/3MJale2XmVvYcS72SLRQRERERESl1FMiLczW41dhumV7kUx7qWIMOtSuQnmXhkZ/Wk5ZR+Fr0IiIiIiIi5ZECeXGu+jcb29h/IDWhSKeYzSbGDmxMBV93diSkMuCz5RxOOnsFGykiIiIiIlJ6KJAX5wqMgohWgBW2/lbk0yr6efLVPS2p4OvO9vgU+n38D2sPJF6xZoqIiIiIiJQWCuTF+ezD6y+euT6/JpGB/P7IdcSE+3PidCZ3fLGSX9ceugINFBERERERKT0UyIvz1e8PmODQKjiw3PhsnQGrv4ITey54apVAL34d0Zae9SuRmWPh6V828snCC58jIiIiIiJSlmkd+UJoHXknmNQXYpcWLA+uAY+sBfOF3zlZLFbe/3sXH+cG8a/dVJ972lW7Ag0VEREREREpeVpHXsqeNg+Dizu4eUNQdYhsA24+kLgP9i246Olms4mne0bzaNfagLE03TQNsxcRERERkXLI1dkNEAGgbm94MQHMLnllfz0Lqz6HNROhVrciXeaJbrVJTc9i4r+xPPPrRnw8XOnVIOwKNVpEREREROTqU4+8lB75g3iAFvcZ251/QfLhIl3CZDLxUp8YBjSPwGKFRyevZ+GOYyXcUBEREREREedRIC+lV8W6ULU9WC2w7rsin2Y2m3j7lobc0CCMzBwL905azWv/28rZzJwr2FgREREREZGrQ4G8lG62Xvl130JOdpFPc3UxM/72JtzRKhKAif/G0ufDpayLO3UlWikiIiIiInLVKJCX0q3ejeBdAVLjYdesSzrVw9WFMbc0YuK9Lank78G+E2kMmLCM/87ZQWa25Qo1WERERERE5MpSIC+lm6sHNBti7K/5pliXuD66InMf78TNTatgscInC/cy4LNl7Dt+ugQbKiIiIiIicnUokJfSr/lQwAR7F8DJvcW6RIC3G+MGNWHC4GYEeLmx6VAyfT78hymr4rBarSXaXBERERERkStJgbyUfkHV8pafWzvpsi51Q8NwZj/egXY1QziblcPz0zcz4od1pGUUff69iIiIiIiIMymQl7LBlvRu/Q+QeeayLhUe4MUPw1oz6oa6uLmYmL01gRE/rtO8eRERERERKRMUyEvZUKcnBFaFs4mw6ovLvpzZbOKhTjWZ8mAbvNxcWLLrOE//shGLRcPsRURERESkdFMgL2WD2QU6jzL2/xkH6cklctnmVYOZcFczXM0mZm48wut/bNOc+UtgsVgZ8vVK7vpqJTl6CSIiIiIiclU4NZCfMGECjRo1wt/fH39/f9q2bcusWRdeYmzx4sU0b94cT09PatSowWeffVagzrRp04iJicHDw4OYmBhmzJhxpR5BrqZGA6FCNKQnwbKPCx4/vA4m3wFH1l/SZTtHV2TswMYATFoWy6eLipdQ71qUkJLO0t0n+GfPCbbHpzi7OSIiIiIi1wSnBvIRERG8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goKCqMnj8XT1IYmIiIiIiIh0KZtlWVasC9GspKSEzMxMVqxYwbRp0zq83ejRo7nhhhv4l3/5F8C0yN9zzz1UVlaeVDmqq6tJSkqiqqqKxMTEk9qHiIiIiIiISEedSBzao8bIV1VVAZCamtrhbSKRCDU1Na22qa2tJT8/n7y8PK644opWLfZHCgQCVFdXR00iIiIiIiIiPVGPCeQty+LHP/4x5513HmPGjOnwdv/5n/9JXV0d119/fcu8kSNH8uyzz7J48WJefvllPB4P5557Ljt27GhzH4899hhJSUktU//+/Tt9PCIiIiIiIiJdocd0rZ87dy5vvPEGH3zwAXl5eR3a5uWXX+b73/8+r7/+OhdffPEx14tEIkyYMIFp06bx+9//vtXyQCBAIBBoeV1dXU3//v3VtV5ERERERES6xYl0rXd0U5mOa968eSxevJiVK1d2OIh/5ZVXuO2221iwYMFxg3gAu93O5MmTj9ki73a7cbvdJ1xuERERERERke4W0671lmVx1113sXDhQt577z0GDRrUoe1efvll5syZw0svvcTll1/eofdZv349OTk5nS2yiIiIiIiISEzFtEV+7ty5vPTSS7z++uv4/X4KCwsBSEpKwuv1AvDAAw9w4MABnn/+ecAE8bfeeiu/+93vmDJlSss2Xq+XpKQkAB599FGmTJnCsGHDqK6u5ve//z3r16/nj3/8YwyOUkREREREROTUiWkg/+STTwIwffr0qPnPPPMMc+bMAaCgoIC9e/e2LPvzn/9MKBRi7ty5zJ07t2X+7NmzefbZZwGorKzkjjvuoLCwkKSkJMaPH8/KlSs566yzOlSu5rQByl4vIiIiIiIi3aE5/uxIGrsek+yuJ9m/f78y14uIiIiIiEi327dvX7u54xTItyESiXDw4EH8fj82my3WxWnRnE1/3759yqbfw+lc9Q46T72DzlPvoPPUO+g89R46V72DzlPv0FvOk2VZ1NTUkJubi91+/HR2PSJrfU9jt9s7nD0/FhITE3v0P6AcpnPVO+g89Q46T72DzlPvoPPUe+hc9Q46T71DbzhPzXnf2hPTrPUiIiIiIiIicmIUyIuIiIiIiIj0IgrkexG3283DDz+M2+2OdVGkHTpXvYPOU++g89Q76Dz1DjpPvYfOVe+g89Q79MXzpGR3IiIiIiIiIr2IWuRFREREREREehEF8iIiIiIiIiK9iAJ5ERERERERkV5EgbyIiIiIiIhIL6JAvhd54oknGDRoEB6Ph4kTJ/L+++/Hukintccee4zJkyfj9/vJzMzkmmuuYdu2bVHrzJkzB5vNFjVNmTIlRiU+PT3yyCOtzkF2dnbLcsuyeOSRR8jNzcXr9TJ9+nQ2b94cwxKfngYOHNjqPNlsNubOnQvoWoqVlStXcuWVV5Kbm4vNZuO1116LWt6R6ycQCDBv3jzS09Px+XxcddVV7N+/vxuP4vRwvHPV1NTE/fffz9ixY/H5fOTm5nLrrbdy8ODBqH1Mnz691XV24403dvOR9G3tXVMd+azTNdX12jtPbX1f2Ww2fvOb37Sso+up63Xkt3hf/p5SIN9LvPLKK9xzzz387Gc/Y926dZx//vnMmjWLvXv3xrpop60VK1Ywd+5cVq1axZIlSwiFQsycOZO6urqo9S699FIKCgpapjfffDNGJT59jR49OuocbNq0qWXZr3/9ax5//HH+8Ic/sHr1arKzs7nkkkuoqamJYYlPP6tXr446R0uWLAHguuuua1lH11L3q6urY9y4cfzhD39oc3lHrp977rmHRYsWMX/+fD744ANqa2u54oorCIfD3XUYp4Xjnav6+nrWrl3LQw89xNq1a1m4cCHbt2/nqquuarXu7bffHnWd/fnPf+6O4p822rumoP3POl1TXa+983Tk+SkoKODpp5/GZrNx7bXXRq2n66lrdeS3eJ/+nrKkVzjrrLOsO++8M2reyJEjrZ/+9KcxKpEcrbi42AKsFStWtMybPXu2dfXVV8euUGI9/PDD1rhx49pcFolErOzsbOuXv/xly7zGxkYrKSnJ+tOf/tRNJZS23H333daQIUOsSCRiWZaupZ4AsBYtWtTyuiPXT2VlpeV0Oq358+e3rHPgwAHLbrdbb731VreV/XRz9Llqy6effmoB1p49e1rmXXDBBdbdd9/dtYWTFm2dp/Y+63RNdb+OXE9XX321NWPGjKh5up6639G/xfv695Ra5HuBYDDImjVrmDlzZtT8mTNn8tFHH8WoVHK0qqoqAFJTU6PmL1++nMzMTIYPH87tt99OcXFxLIp3WtuxYwe5ubkMGjSIG2+8kZ07dwKwa9cuCgsLo64tt9vNBRdcoGsrhoLBIC+88ALf+973sNlsLfN1LfUsHbl+1qxZQ1NTU9Q6ubm5jBkzRtdYjFVVVWGz2UhOTo6a/+KLL5Kens7o0aO577771DspBo73WadrqucpKirijTfe4Lbbbmu1TNdT9zr6t3hf/55yxLoA0r7S0lLC4TBZWVlR87OysigsLIxRqeRIlmXx4x//mPPOO48xY8a0zJ81axbXXXcd+fn57Nq1i4ceeogZM2awZs0a3G53DEt8+jj77LN5/vnnGT58OEVFRfziF7/gnHPOYfPmzS3XT1vX1p49e2JRXAFee+01KisrmTNnTss8XUs9T0eun8LCQlwuFykpKa3W0fdX7DQ2NvLTn/6Ub3/72yQmJrbMv/nmmxk0aBDZ2dl8/vnnPPDAA2zYsKFlqIt0vfY+63RN9TzPPfccfr+fb37zm1HzdT11r7Z+i/f17ykF8r3IkS1TYP5hj54nsXHXXXexceNGPvjgg6j5N9xwQ8vzMWPGMGnSJPLz83njjTdafeBL15g1a1bL87FjxzJ16lSGDBnCc88915JASNdWz/LUU08xa9YscnNzW+bpWuq5Tub60TUWO01NTdx4441EIhGeeOKJqGW33357y/MxY8YwbNgwJk2axNq1a5kwYUJ3F/W0dLKfdbqmYufpp5/m5ptvxuPxRM3X9dS9jvVbHPru95S61vcC6enpxMXFtaoVKi4ublXDJN1v3rx5LF68mGXLlpGXl3fcdXNycsjPz2fHjh3dVDo5ms/nY+zYsezYsaMle72urZ5jz549LF26lO9///vHXU/XUux15PrJzs4mGAxSUVFxzHWk+zQ1NXH99deza9culixZEtUa35YJEybgdDp1ncXQ0Z91uqZ6lvfff59t27a1+50Fup660rF+i/f17ykF8r2Ay+Vi4sSJrbriLFmyhHPOOSdGpRLLsrjrrrtYuHAh7733HoMGDWp3m7KyMvbt20dOTk43lFDaEggE2Lp1Kzk5OS1d3o68toLBICtWrNC1FSPPPPMMmZmZXH755cddT9dS7HXk+pk4cSJOpzNqnYKCAj7//HNdY92sOYjfsWMHS5cuJS0trd1tNm/eTFNTk66zGDr6s07XVM/y1FNPMXHiRMaNG9fuurqeTr32fov3+e+pGCXZkxM0f/58y+l0Wk899ZS1ZcsW65577rF8Pp+1e/fuWBfttPWDH/zASkpKspYvX24VFBS0TPX19ZZlWVZNTY117733Wh999JG1a9cua9myZdbUqVOtfv36WdXV1TEu/enj3nvvtZYvX27t3LnTWrVqlXXFFVdYfr+/5dr55S9/aSUlJVkLFy60Nm3aZN10001WTk6OzlEMhMNha8CAAdb9998fNV/XUuzU1NRY69ats9atW2cB1uOPP26tW7euJdN5R66fO++808rLy7OWLl1qrV271poxY4Y1btw4KxQKxeqw+qTjnaumpibrqquusvLy8qz169dHfWcFAgHLsizryy+/tB599FFr9erV1q5du6w33njDGjlypDV+/Hidq1PoeOepo591uqa6XnuffZZlWVVVVVZ8fLz15JNPttpe11P3aO+3uGX17e8pBfK9yB//+EcrPz/fcrlc1oQJE6JucybdD2hzeuaZZyzLsqz6+npr5syZVkZGhuV0Oq0BAwZYs2fPtvbu3Rvbgp9mbrjhBisnJ8dyOp1Wbm6u9c1vftPavHlzy/JIJGI9/PDDVnZ2tuV2u61p06ZZmzZtimGJT19vv/22BVjbtm2Lmq9rKXaWLVvW5ufc7NmzLcvq2PXT0NBg3XXXXVZqaqrl9XqtK664QueuCxzvXO3ateuY31nLli2zLMuy9u7da02bNs1KTU21XC6XNWTIEOuHP/yhVVZWFtsD62OOd546+lmna6rrtffZZ1mW9ec//9nyer1WZWVlq+11PXWP9n6LW1bf/p6yWZZldVFjv4iIiIiIiIicYhojLyIiIiIiItKLKJAXERERERER6UUUyIuIiIiIiIj0IgrkRURERERERHoRBfIiIiIiIiIivYgCeREREREREZFeRIG8iIiIiIiISC+iQF5ERERERESkF1EgLyIiIjFns9l47bXXYl0MERGRXkGBvIiIyGluzpw52Gy2VtOll14a66KJiIhIGxyxLoCIiIjE3qWXXsozzzwTNc/tdseoNCIiInI8apEXERER3G432dnZUVNKSgpgur0/+eSTzJo1C6/Xy6BBg1iwYEHU9ps2bWLGjBl4vV7S0tK44447qK2tjVrn6aefZvTo0bjdbnJycrjrrruilpeWlvKNb3yD+Ph4hg0bxuLFi7v2oEVERHopBfIiIiLSroceeohrr72WDRs28J3vfIebbrqJrVu3AlBfX8+ll15KSkoKq1evZsGCBSxdujQqUH/yySeZO3cud9xxB5s2bWLx4sUMHTo06j0effRRrr/+ejZu3Mhll13GzTffTHl5ebcep4iISG9gsyzLinUhREREJHbmzJnDCy+8gMfjiZp///3389BDD2Gz2bjzzjt58sknW5ZNmTKFCRMm8MQTT/CXv/yF+++/n3379uHz+QB48803ufLKKzl48CBZWVn069eP7373u/ziF79osww2m40HH3yQn//85wDU1dXh9/t58803NVZfRETkKBojLyIiIlx44YVRgTpAampqy/OpU6dGLZs6dSrr168HYOvWrYwbN64liAc499xziUQibNu2DZvNxsGDB7nooouOW4Yzzzyz5bnP58Pv91NcXHyyhyQiItJnKZAXERERfD5fq67u7bHZbABYltXyvK11vF5vh/bndDpbbRuJRE6oTCIiIqcDjZEXERGRdq1atarV65EjRwIwatQo1q9fT11dXcvyDz/8ELvdzvDhw/H7/QwcOJB33323W8ssIiLSV6lFXkRERAgEAhQWFkbNczgcpKenA7BgwQImTZrEeeedx4svvsinn37KU089BcDNN9/Mww8/zOzZs3nkkUcoKSlh3rx53HLLLWRlZQHwyCOPcOedd5KZmcmsWbOoqanhww8/ZN68ed17oCIiIn2AAnkRERHhrbfeIicnJ2reiBEj+OKLLwCTUX7+/Pn84z/+I9nZ2bz44ouMGjUKgPj4eN5++23uvvtuJk+eTHx8PNdeey2PP/54y75mz55NY2Mjv/3tb7nvvvtIT0/nW9/6VvcdoIiISB+irPUiIiJyXDabjUWLFnHNNdfEuigiIiKCxsiLiIiIiIiI9CoK5EVERERERER6EY2RFxERkePSKDwREZGeRS3yIiIiIiIiIr2IAnkRERERERGRXkSBvIiIiIiIiEgvokBeREREREREpBdRIC8iIiIiIiLSiyiQFxEREREREelFFMiLiIiIiIiI9CIK5EVERERERER6kf8PwZBqxLVeIrkAAAAASUVORK5CYII="},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 1200x500 with 1 Axes>","image/png":"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nFdERIRH/2eCievkHbhO3oNr5R24Tt6B6+QduE7eg2vlHbzhOtXXQl6Nid4AAAAAALAIoRwAAAAAAIsQyi1it9v1wgsvyG63W10KLoDr5B24Tt6Da+UduE7egevkHbhO3oNr5R188Tr5/ERvAAAAAAB4KlrKAQAAAACwCKEcAAAAAACLEMoBAAAAALAIoRwAAAAAAIsQyi3wxhtvKCkpScHBwerXr59Wr15tdUnN2qxZszRgwACFh4crJiZG48aN0+7du2ucM2nSJNlsthqPQYMGWVRx8zVjxoxa1yEuLs553DAMzZgxQwkJCQoJCdHw4cO1Y8cOCytunjp27FjrOtlsNk2ePFkS95NVVq1apRtvvFEJCQmy2WxatGhRjeMNuX9KS0s1depURUdHKywsTDfddJMOHz7chF+F77vQdSovL9czzzyj3r17KywsTAkJCbr//vt19OjRGu8xfPjwWvfYnXfe2cRfie+r755qyPc67in3q+861fXzymaz6Q9/+IPzHO4p92rI7+K+/jOKUN7EFixYoGnTpum5557T5s2bdfXVVys1NVWHDh2yurRma+XKlZo8ebLWrl2rpUuXqqKiQqNHj1ZRUVGN88aMGaNjx445H4sXL7ao4uatZ8+eNa5DWlqa89jLL7+sV199VbNnz9b69esVFxenUaNGqaCgwMKKm5/169fXuEZLly6VJN12223Oc7ifml5RUZFSUlI0e/bsOo835P6ZNm2aFi5cqPnz5+ubb75RYWGhbrjhBlVWVjbVl+HzLnSdTp8+rU2bNun555/Xpk2b9Omnn2rPnj266aabap370EMP1bjH3nzzzaYov1mp756S6v9exz3lfvVdp7Ovz7Fjx/TOO+/IZrNpwoQJNc7jnnKfhvwu7vM/oww0qSuvvNJ49NFHa+zr3r278atf/cqiinCu7OxsQ5KxcuVK576JEycaN998s3VFwTAMw3jhhReMlJSUOo85HA4jLi7OeOmll5z7SkpKjMjISONvf/tbE1WIujz55JNG586dDYfDYRgG95MnkGQsXLjQ+XFD7p/c3FwjMDDQmD9/vvOcI0eOGH5+fsaSJUuarPbm5NzrVJd169YZkoyDBw86911zzTXGk08+6d7iUENd16q+73XcU02vIffUzTffbIwcObLGPu6ppnXu7+LN4WcULeVNqKysTBs3btTo0aNr7B89erTWrFljUVU4V15eniQpKiqqxv4VK1YoJiZGXbt21UMPPaTs7Gwrymv29u7dq4SEBCUlJenOO+/U/v37JUnp6enKzMyscX/Z7XZdc8013F8WKisr0wcffKCf/vSnstlszv3cT56lIffPxo0bVV5eXuOchIQE9erVi3vMQnl5ebLZbGrZsmWN/fPmzVN0dLR69uypn//85/QYssiFvtdxT3merKwsffHFF3rwwQdrHeOeajrn/i7eHH5GBVhdQHNy/PhxVVZWKjY2tsb+2NhYZWZmWlQVzmYYhp566ikNHTpUvXr1cu5PTU3VbbfdpsTERKWnp+v555/XyJEjtXHjRtntdgsrbl4GDhyo9957T127dlVWVpZefPFFDRkyRDt27HDeQ3XdXwcPHrSiXEhatGiRcnNzNWnSJOc+7ifP05D7JzMzU0FBQWrVqlWtc/gZZo2SkhL96le/0t13362IiAjn/nvuuUdJSUmKi4vT9u3bNX36dG3dutU5lARNo77vddxTnufdd99VeHi4xo8fX2M/91TTqet38ebwM4pQboGzW4sk8z/fuftgjSlTpmjbtm365ptvauy/4447nNu9evVS//79lZiYqC+++KLWN264T2pqqnO7d+/eGjx4sDp37qx3333XOXkO95dnefvtt5WamqqEhATnPu4nz3Ux9w/3mDXKy8t15513yuFw6I033qhx7KGHHnJu9+rVS8nJyerfv782bdqkvn37NnWpzdbFfq/jnrLOO++8o3vuuUfBwcE19nNPNZ3z/S4u+fbPKLqvN6Ho6Gj5+/vX+mtNdnZ2rb/8oOlNnTpVn3/+ub7++mu1a9fugufGx8crMTFRe/fubaLqUJewsDD17t1be/fudc7Czv3lOQ4ePKhly5bpZz/72QXP436yXkPun7i4OJWVlenUqVPnPQdNo7y8XLfffrvS09O1dOnSGq3kdenbt68CAwO5xyx27vc67inPsnr1au3evbven1kS95S7nO938ebwM4pQ3oSCgoLUr1+/Wl1dli5dqiFDhlhUFQzD0JQpU/Tpp59q+fLlSkpKqvc1J06cUEZGhuLj45ugQpxPaWmpdu3apfj4eGe3srPvr7KyMq1cuZL7yyJz585VTEyMxo4de8HzuJ+s15D7p1+/fgoMDKxxzrFjx7R9+3busSZUHcj37t2rZcuWqXXr1vW+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"},"metadata":{}}]},{"cell_type":"code","source":"#下面是coordinate","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport math\nimport torch.nn.functional as F\n\n__all__ = ['mbv2_ca']\n\nclass ConvBNReLU(nn.Sequential):\n    def __init__(self, in_planes, out_planes, kernel_size=3, stride=1, groups=1):\n        padding = (kernel_size - 1) // 2\n        super(ConvBNReLU, self).__init__(\n            nn.Conv2d(in_planes, out_planes, kernel_size, stride, padding, groups=groups, bias=False),\n            nn.BatchNorm2d(out_planes),\n            nn.ReLU6(inplace=True)\n        )\n\nclass h_sigmoid(nn.Module):\n    def __init__(self, inplace=True):\n        super(h_sigmoid, self).__init__()\n        self.relu = nn.ReLU6(inplace=inplace)\n\n    def forward(self, x):\n        return self.relu(x + 3) / 6\n\nclass h_swish(nn.Module):\n    def __init__(self, inplace=True):\n        super(h_swish, self).__init__()\n        self.sigmoid = h_sigmoid(inplace=inplace)\n\n    def forward(self, x):\n        return x * self.sigmoid(x)\n\nclass swish(nn.Module):\n    def forward(self, x):\n        return x * torch.sigmoid(x)\n    \nclass CoordAtt(nn.Module):\n    def __init__(self, inp, oup, groups=32):\n        super(CoordAtt, self).__init__()\n        self.pool_h = nn.AdaptiveAvgPool2d((None, 1))\n        self.pool_w = nn.AdaptiveAvgPool2d((1, None))\n\n        mip = max(8, inp // groups)\n\n        self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)\n        self.bn1 = nn.BatchNorm2d(mip)\n        self.conv2 = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)\n        self.conv3 = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)\n        self.relu = h_swish()\n\n    def forward(self, x):\n        identity = x\n        n,c,h,w = x.size()\n        x_h = self.pool_h(x)\n        x_w = self.pool_w(x).permute(0, 1, 3, 2)\n\n        y = torch.cat([x_h, x_w], dim=2)\n        y = self.conv1(y)\n        y = self.bn1(y)\n        y = self.relu(y) \n        x_h, x_w = torch.split(y, [h, w], dim=2)\n        x_w = x_w.permute(0, 1, 3, 2)\n\n        x_h = self.conv2(x_h).sigmoid()\n        x_w = self.conv3(x_w).sigmoid()\n        x_h = x_h.expand(-1, -1, h, w)\n        x_w = x_w.expand(-1, -1, h, w)\n\n        y = identity * x_w * x_h\n\n        return y\n\ndef _make_divisible(v, divisor, min_value=None):\n    \"\"\"\n    This function is taken from the original tf repo.\n    It ensures that all layers have a channel number that is divisible by 8\n    It can be seen here:\n    https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py\n    :param v:\n    :param divisor:\n    :param min_value:\n    :return:\n    \"\"\"\n    if min_value is None:\n        min_value = divisor\n    new_v = max(min_value, int(v + divisor / 2) // divisor * divisor)\n    # Make sure that round down does not go down by more than 10%.\n    if new_v < 0.9 * v:\n        new_v += divisor\n    return new_v\n\n\ndef conv_3x3_bn(inp, oup, stride):\n    return nn.Sequential(\n        nn.Conv2d(inp, oup, 3, stride, 1, bias=False),\n        nn.BatchNorm2d(oup),\n        nn.ReLU6(inplace=True)\n    )\n\n\ndef conv_1x1_bn(inp, oup):\n    return nn.Sequential(\n        nn.Conv2d(inp, oup, 1, 1, 0, bias=False),\n        nn.BatchNorm2d(oup),\n        nn.ReLU6(inplace=True)\n    )\n\nclass InvertedResidual(nn.Module):\n    def __init__(self, inp, oup, stride, expand_ratio):\n        super(InvertedResidual, self).__init__()\n        assert stride in [1, 2]\n\n        hidden_dim = round(inp * expand_ratio)\n        self.identity = stride == 1 and inp == oup\n\n        if expand_ratio == 1:\n            self.conv = nn.Sequential(\n                # dw\n                nn.Conv2d(hidden_dim, hidden_dim, 3, stride, 1, groups=hidden_dim, bias=False),\n                nn.BatchNorm2d(hidden_dim),\n                nn.ReLU6(inplace=True),\n                # pw-linear\n                nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False),\n                nn.BatchNorm2d(oup),\n            )\n        else:\n            self.conv = nn.Sequential(\n                # pw\n                nn.Conv2d(inp, hidden_dim, 1, 1, 0, bias=False),\n                nn.BatchNorm2d(hidden_dim),\n                nn.ReLU6(inplace=True),\n                # dw\n                nn.Conv2d(hidden_dim, hidden_dim, 3, stride, 1, groups=hidden_dim, bias=False),\n                nn.BatchNorm2d(hidden_dim),\n                nn.ReLU6(inplace=True),\n                # coordinate attention\n                CoordAtt(hidden_dim, hidden_dim),\n                # pw-linear\n                nn.Conv2d(hidden_dim, oup, 1, 1, 0, bias=False),\n                nn.BatchNorm2d(oup),\n            )\n\n    def forward(self, x):\n        y = self.conv(x)\n        if self.identity:\n            return x + y\n        else:\n            return y\n\nclass MBV2_CA(nn.Module):\n    def __init__(self, num_classes=100, width_mult=1.):\n        super(MBV2_CA, self).__init__()\n        # setting of inverted residual blocks\n        self.cfgs = [\n            # t, c, n, s\n            [1,  16, 1, 1],\n            [6,  24, 2, 2],\n            [6,  32, 3, 2],\n            [6,  64, 4, 2],\n            [6,  96, 3, 1],\n            [6, 160, 3, 2],\n            [6, 320, 1, 1],\n        ]\n\n        # building first layer\n        input_channel = _make_divisible(32 * width_mult, 4 if width_mult == 0.1 else 8)\n        layers = [conv_3x3_bn(3, input_channel, 2)]\n        # building inverted residual blocks\n        block = InvertedResidual\n        for t, c, n, s in self.cfgs:\n            output_channel = _make_divisible(c * width_mult, 4 if width_mult == 0.1 else 8)\n            for i in range(n):\n                layers.append(block(input_channel, output_channel, s if i == 0 else 1, t))\n                input_channel = output_channel\n        self.features = nn.Sequential(*layers)\n        # building last several layers\n        output_channel = _make_divisible(1280 * width_mult, 4 if width_mult == 0.1 else 8) if width_mult > 1.0 else 1280\n        self.conv = conv_1x1_bn(input_channel, output_channel)\n        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))\n        self.classifier = nn.Sequential(\n                nn.Dropout(0.1),\n                nn.Linear(output_channel, num_classes)\n                )\n\n        self._initialize_weights()\n\n    def forward(self, x):\n        x = self.features(x)\n        x = self.conv(x)\n        x = self.avgpool(x)\n        x = x.view(x.size(0), -1)\n        x = self.classifier(x)\n\n        return x\n\n    def _initialize_weights(self):\n        for m in self.modules():\n            #print(m)\n            if isinstance(m, nn.Conv2d):\n                #print(m.weight.size())\n                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels\n                m.weight.data.normal_(0, math.sqrt(2. / n))\n                if m.bias is not None:\n                    m.bias.data.zero_()\n            elif isinstance(m, nn.BatchNorm2d):\n                m.weight.data.fill_(1)\n                m.bias.data.zero_()\n            elif isinstance(m, nn.Linear):\n                m.weight.data.normal_(0, 0.01)\n                m.bias.data.zero_()\n\n\ndef mbv2_ca(**kwargs):\n    return  MBV2_CA(**kwargs)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:43.192192Z","iopub.execute_input":"2023-05-27T17:20:43.192600Z","iopub.status.idle":"2023-05-27T17:20:43.230897Z","shell.execute_reply.started":"2023-05-27T17:20:43.192562Z","shell.execute_reply":"2023-05-27T17:20:43.229767Z"},"trusted":true},"execution_count":15,"outputs":[]},{"cell_type":"code","source":"model = mbv2_ca().to(device)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:43.232737Z","iopub.execute_input":"2023-05-27T17:20:43.233151Z","iopub.status.idle":"2023-05-27T17:20:43.571615Z","shell.execute_reply.started":"2023-05-27T17:20:43.233118Z","shell.execute_reply":"2023-05-27T17:20:43.570639Z"},"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"code","source":"# Define the loss function and optimizer\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-5)\n\n# Define the learning rate schedule\nlr_schedule_milestones = [int(num_epochs * 0.5), int(num_epochs * 0.75)]  # 50% and 75% of total training epochs\nlr_schedule_gamma = 0.1  # Learning rate reduction factor\n\n# Define the learning rate scheduler\nscheduler = lr_scheduler.MultiStepLR(optimizer, milestones=lr_schedule_milestones, gamma=lr_schedule_gamma)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:43.573382Z","iopub.execute_input":"2023-05-27T17:20:43.573716Z","iopub.status.idle":"2023-05-27T17:20:43.586522Z","shell.execute_reply.started":"2023-05-27T17:20:43.573684Z","shell.execute_reply":"2023-05-27T17:20:43.585560Z"},"trusted":true},"execution_count":17,"outputs":[]},{"cell_type":"code","source":"# Lists to store training and testing losses, and accuracies\ntrain_losses = []\ntest_losses = []\ntrain_accs = []\ntest_accs = []","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:43.588453Z","iopub.execute_input":"2023-05-27T17:20:43.589283Z","iopub.status.idle":"2023-05-27T17:20:43.594770Z","shell.execute_reply.started":"2023-05-27T17:20:43.589244Z","shell.execute_reply":"2023-05-27T17:20:43.593410Z"},"trusted":true},"execution_count":18,"outputs":[]},{"cell_type":"code","source":"num_epochs=300","metadata":{"execution":{"iopub.status.busy":"2023-05-27T11:35:20.606319Z","iopub.execute_input":"2023-05-27T11:35:20.606684Z","iopub.status.idle":"2023-05-27T11:35:20.612176Z","shell.execute_reply.started":"2023-05-27T11:35:20.606656Z","shell.execute_reply":"2023-05-27T11:35:20.611291Z"},"trusted":true},"execution_count":29,"outputs":[]},{"cell_type":"code","source":"# Training loop\ntotal_steps = len(train_loader)\nfor epoch in range(num_epochs):\n    train_loss = 0.0\n    train_total = 0\n    train_correct = 0\n\n    for i, (images, labels) in enumerate(train_loader):\n        images = images.to(device)\n        labels = labels.to(device)\n        # Forward pass\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        # Backward and optimize\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        train_loss += loss.item()\n        _, predicted = torch.max(outputs.data, 1)\n        train_total += labels.size(0)\n        train_correct += (predicted == labels).sum().item()\n        # Print training progress\n        if (i + 1) % 100 == 0:\n            print(\n                f\"Epoch [{epoch + 1}/{num_epochs}], Step [{i + 1}/{total_steps}], Loss: {train_loss / (i + 1):.4f}\")\n\n    train_acc = 100.0 * train_correct / train_total\n    train_losses.append(train_loss / total_steps)\n    train_accs.append(train_acc)\n    scheduler.step()\n    \n    # Evaluation on the test set\n    model.eval()\n    test_loss = 0.0\n    test_total = 0\n    test_correct = 0\n\n    with torch.no_grad():\n        for images, labels in test_loader:\n            images = images.to(device)\n            labels = labels.to(device)\n\n            # Forward pass\n            outputs = model(images)\n            loss = criterion(outputs, labels)\n\n            test_loss += loss.item()\n            _, predicted = torch.max(outputs.data, 1)\n            test_total += labels.size(0)\n            test_correct += (predicted == labels).sum().item()\n\n    test_acc = 100.0 * test_correct / test_total\n    test_losses.append(test_loss / len(test_loader))\n    test_accs.append(test_acc)\n\n    # Print test accuracy for the current epoch\n    print(f\"Epoch [{epoch+1}/{num_epochs}], Test Loss: {test_loss / len(test_loader):.4f}, Test Accuracy: {test_acc:.2f}%\")\n\n    # Switch back to training mode\n    model.train()","metadata":{"execution":{"iopub.status.busy":"2023-05-27T17:20:43.598800Z","iopub.execute_input":"2023-05-27T17:20:43.599165Z","iopub.status.idle":"2023-05-27T18:40:20.404397Z","shell.execute_reply.started":"2023-05-27T17:20:43.599141Z","shell.execute_reply":"2023-05-27T18:40:20.402385Z"},"trusted":true},"execution_count":19,"outputs":[{"name":"stdout","text":"Epoch [1/200], Test Loss: 3.9652, Test Accuracy: 8.69%\nEpoch [2/200], Test Loss: 3.6504, Test Accuracy: 12.70%\nEpoch [3/200], Test Loss: 3.5260, Test Accuracy: 15.52%\nEpoch [4/200], Test Loss: 3.3936, Test Accuracy: 17.57%\nEpoch [5/200], Test Loss: 3.3010, Test Accuracy: 19.00%\nEpoch [6/200], Test Loss: 3.2128, Test Accuracy: 21.42%\nEpoch [7/200], Test Loss: 3.1407, Test Accuracy: 22.38%\nEpoch [8/200], Test Loss: 3.0697, Test Accuracy: 24.04%\nEpoch [9/200], Test Loss: 2.9922, Test Accuracy: 25.65%\nEpoch [10/200], Test Loss: 2.9487, Test Accuracy: 26.60%\nEpoch [11/200], Test Loss: 2.9373, Test Accuracy: 26.30%\nEpoch [12/200], Test Loss: 3.1798, Test Accuracy: 23.03%\nEpoch [13/200], Test Loss: 2.8631, Test Accuracy: 27.79%\nEpoch [14/200], Test Loss: 2.8242, Test Accuracy: 28.17%\nEpoch [15/200], Test Loss: 2.7490, Test Accuracy: 30.76%\nEpoch [16/200], Test Loss: 2.7748, Test Accuracy: 30.04%\nEpoch [17/200], Test Loss: 2.6281, Test Accuracy: 33.10%\nEpoch [18/200], Test Loss: 2.6150, Test Accuracy: 33.83%\nEpoch [19/200], Test Loss: 2.6687, Test Accuracy: 32.86%\nEpoch [20/200], Test Loss: 2.5708, Test Accuracy: 34.40%\nEpoch [21/200], Test Loss: 2.5356, Test Accuracy: 34.73%\nEpoch [22/200], Test Loss: 2.4788, Test Accuracy: 36.36%\nEpoch [23/200], Test Loss: 2.4999, Test Accuracy: 36.12%\nEpoch [24/200], Test Loss: 2.5155, Test Accuracy: 35.86%\nEpoch [25/200], Test Loss: 2.5725, Test Accuracy: 34.52%\nEpoch [26/200], Test Loss: 2.4529, Test Accuracy: 37.89%\nEpoch [27/200], Test Loss: 2.3800, Test Accuracy: 38.65%\nEpoch [28/200], Test Loss: 2.4588, Test Accuracy: 37.60%\nEpoch [29/200], Test Loss: 2.3755, Test Accuracy: 39.69%\nEpoch [30/200], Test Loss: 2.4361, Test Accuracy: 37.94%\nEpoch [31/200], Test Loss: 2.4139, Test Accuracy: 39.25%\nEpoch [32/200], Test Loss: 2.3506, Test Accuracy: 39.94%\nEpoch [33/200], Test Loss: 2.3004, Test Accuracy: 40.85%\nEpoch [34/200], Test Loss: 2.4155, Test Accuracy: 40.08%\nEpoch [35/200], Test Loss: 2.4204, Test Accuracy: 39.74%\nEpoch [36/200], Test Loss: 2.4035, Test Accuracy: 40.88%\nEpoch [37/200], Test Loss: 2.3853, Test Accuracy: 41.17%\nEpoch [38/200], Test Loss: 2.4075, Test Accuracy: 41.11%\nEpoch [39/200], Test Loss: 2.4379, Test Accuracy: 40.79%\nEpoch [40/200], Test Loss: 2.4036, Test Accuracy: 41.88%\nEpoch [41/200], Test Loss: 2.3597, Test Accuracy: 42.63%\nEpoch [42/200], Test Loss: 2.4100, Test Accuracy: 41.99%\nEpoch [43/200], Test Loss: 2.3927, Test Accuracy: 42.83%\nEpoch [44/200], Test Loss: 2.5513, Test Accuracy: 41.47%\nEpoch [45/200], Test Loss: 2.4500, Test Accuracy: 42.68%\nEpoch [46/200], Test Loss: 2.4765, Test Accuracy: 42.39%\nEpoch [47/200], Test Loss: 2.6040, Test Accuracy: 41.35%\nEpoch [48/200], Test Loss: 2.5675, Test Accuracy: 41.94%\nEpoch [49/200], Test Loss: 2.4461, Test Accuracy: 43.64%\nEpoch [50/200], Test Loss: 2.5306, Test Accuracy: 42.45%\nEpoch [51/200], Test Loss: 2.6205, Test Accuracy: 41.27%\nEpoch [52/200], Test Loss: 2.6100, Test Accuracy: 42.18%\nEpoch [53/200], Test Loss: 2.5747, Test Accuracy: 43.41%\nEpoch [54/200], Test Loss: 2.6408, Test Accuracy: 41.88%\nEpoch [55/200], Test Loss: 2.6892, Test Accuracy: 42.22%\nEpoch [56/200], Test Loss: 2.8061, Test Accuracy: 41.55%\nEpoch [57/200], Test Loss: 2.6752, Test Accuracy: 42.16%\nEpoch [58/200], Test Loss: 2.6767, Test Accuracy: 42.95%\nEpoch [59/200], Test Loss: 2.6829, Test Accuracy: 43.27%\nEpoch [60/200], Test Loss: 2.7307, Test Accuracy: 42.97%\nEpoch [61/200], Test Loss: 2.7289, Test Accuracy: 43.94%\nEpoch [62/200], Test Loss: 2.7584, Test Accuracy: 43.41%\nEpoch [63/200], Test Loss: 2.8992, Test Accuracy: 42.11%\nEpoch [64/200], Test Loss: 2.8917, Test Accuracy: 42.27%\nEpoch [65/200], Test Loss: 2.9076, Test Accuracy: 41.97%\nEpoch [66/200], Test Loss: 2.8052, Test Accuracy: 43.51%\nEpoch [67/200], Test Loss: 2.8886, Test Accuracy: 42.98%\nEpoch [68/200], Test Loss: 2.9260, Test Accuracy: 42.50%\nEpoch [69/200], Test Loss: 2.8513, Test Accuracy: 43.85%\nEpoch [70/200], Test Loss: 3.0376, Test Accuracy: 42.10%\nEpoch [71/200], Test Loss: 2.9898, Test Accuracy: 43.46%\nEpoch [72/200], Test Loss: 3.0598, Test Accuracy: 42.09%\nEpoch [73/200], Test Loss: 2.9433, Test Accuracy: 43.64%\nEpoch [74/200], Test Loss: 2.9739, Test Accuracy: 43.61%\nEpoch [75/200], Test Loss: 2.9756, Test Accuracy: 44.00%\nEpoch [76/200], Test Loss: 3.0012, Test Accuracy: 43.87%\nEpoch [77/200], Test Loss: 3.0703, Test Accuracy: 43.51%\nEpoch [78/200], Test Loss: 3.0702, Test Accuracy: 43.58%\nEpoch [79/200], Test Loss: 3.1248, Test Accuracy: 43.20%\nEpoch [80/200], Test Loss: 3.2090, Test Accuracy: 42.66%\nEpoch [81/200], Test Loss: 3.1030, Test Accuracy: 44.26%\nEpoch [82/200], Test Loss: 3.1654, Test Accuracy: 43.45%\nEpoch [83/200], Test Loss: 3.1938, Test Accuracy: 43.55%\nEpoch [84/200], Test Loss: 3.1794, Test Accuracy: 44.47%\nEpoch [85/200], Test Loss: 3.1877, Test Accuracy: 43.88%\nEpoch [86/200], Test Loss: 3.2050, Test Accuracy: 43.84%\nEpoch [87/200], Test Loss: 3.1279, Test Accuracy: 44.52%\nEpoch [88/200], Test Loss: 3.2772, Test Accuracy: 43.17%\nEpoch [89/200], Test Loss: 3.2233, Test Accuracy: 43.88%\nEpoch [90/200], Test Loss: 3.2665, Test Accuracy: 43.91%\nEpoch [91/200], Test Loss: 3.2810, Test Accuracy: 44.05%\nEpoch [92/200], Test Loss: 3.3033, Test Accuracy: 43.87%\nEpoch [93/200], Test Loss: 3.3099, Test Accuracy: 43.70%\nEpoch [94/200], Test Loss: 3.3031, Test Accuracy: 44.44%\nEpoch [95/200], Test Loss: 3.2970, Test Accuracy: 44.09%\nEpoch [96/200], Test Loss: 3.3216, Test Accuracy: 43.92%\nEpoch [97/200], Test Loss: 3.3269, Test Accuracy: 43.89%\nEpoch [98/200], Test Loss: 3.3341, Test Accuracy: 44.27%\nEpoch [99/200], Test Loss: 3.2750, Test Accuracy: 44.33%\nEpoch [100/200], Test Loss: 3.3346, Test Accuracy: 44.03%\nEpoch [101/200], Test Loss: 3.0307, Test Accuracy: 47.70%\nEpoch [102/200], Test Loss: 3.0274, Test Accuracy: 48.24%\nEpoch [103/200], Test Loss: 3.0222, Test Accuracy: 48.30%\nEpoch [104/200], Test Loss: 3.0204, Test Accuracy: 48.32%\nEpoch [105/200], Test Loss: 3.0241, Test Accuracy: 48.39%\nEpoch [106/200], Test Loss: 3.0311, Test Accuracy: 48.61%\nEpoch [107/200], Test Loss: 3.0339, Test Accuracy: 48.59%\nEpoch [108/200], Test Loss: 3.0496, Test Accuracy: 48.51%\nEpoch [109/200], Test Loss: 3.0544, Test Accuracy: 48.48%\nEpoch [110/200], Test Loss: 3.0568, Test Accuracy: 48.60%\nEpoch [111/200], Test Loss: 3.0524, Test Accuracy: 48.59%\nEpoch [112/200], Test Loss: 3.0642, Test Accuracy: 48.65%\nEpoch [113/200], Test Loss: 3.0575, Test Accuracy: 48.69%\nEpoch [114/200], Test Loss: 3.0697, Test Accuracy: 48.68%\nEpoch [115/200], Test Loss: 3.0754, Test Accuracy: 48.86%\nEpoch [116/200], Test Loss: 3.0792, Test Accuracy: 48.70%\nEpoch [117/200], Test Loss: 3.0833, Test Accuracy: 48.62%\nEpoch [118/200], Test Loss: 3.0827, Test Accuracy: 48.42%\nEpoch [119/200], Test Loss: 3.0879, Test Accuracy: 48.57%\nEpoch [120/200], Test Loss: 3.0881, Test Accuracy: 48.48%\nEpoch [121/200], Test Loss: 3.0962, Test Accuracy: 48.68%\nEpoch [122/200], Test Loss: 3.1047, Test Accuracy: 48.51%\nEpoch [123/200], Test Loss: 3.1106, Test Accuracy: 48.63%\nEpoch [124/200], Test Loss: 3.1124, Test Accuracy: 48.74%\nEpoch [125/200], Test Loss: 3.1188, Test Accuracy: 48.30%\nEpoch [126/200], Test Loss: 3.1156, Test Accuracy: 48.48%\nEpoch [127/200], Test Loss: 3.1252, Test Accuracy: 48.44%\nEpoch [128/200], Test Loss: 3.1253, Test Accuracy: 48.50%\nEpoch [129/200], Test Loss: 3.1258, Test Accuracy: 48.50%\nEpoch [130/200], Test Loss: 3.1267, Test Accuracy: 48.46%\nEpoch [131/200], Test Loss: 3.1349, Test Accuracy: 48.51%\nEpoch [132/200], Test Loss: 3.1353, Test Accuracy: 48.71%\nEpoch [133/200], Test Loss: 3.1421, Test Accuracy: 48.55%\nEpoch [134/200], Test Loss: 3.1441, Test Accuracy: 48.60%\nEpoch [135/200], Test Loss: 3.1462, Test Accuracy: 48.51%\nEpoch [136/200], Test Loss: 3.1546, Test Accuracy: 48.61%\nEpoch [137/200], Test Loss: 3.1533, Test Accuracy: 48.62%\nEpoch [138/200], Test Loss: 3.1549, Test Accuracy: 48.58%\nEpoch [139/200], Test Loss: 3.1508, Test Accuracy: 48.66%\nEpoch [140/200], Test Loss: 3.1550, Test Accuracy: 48.66%\nEpoch [141/200], Test Loss: 3.1610, Test Accuracy: 48.59%\nEpoch [142/200], Test Loss: 3.1631, Test Accuracy: 48.52%\nEpoch [143/200], Test Loss: 3.1690, Test Accuracy: 48.68%\nEpoch [144/200], Test Loss: 3.1637, Test Accuracy: 48.74%\nEpoch [145/200], Test Loss: 3.1606, Test Accuracy: 48.43%\nEpoch [146/200], Test Loss: 3.1661, Test Accuracy: 48.67%\nEpoch [147/200], Test Loss: 3.1703, Test Accuracy: 48.56%\nEpoch [148/200], Test Loss: 3.1748, Test Accuracy: 48.52%\nEpoch [149/200], Test Loss: 3.1787, Test Accuracy: 48.52%\nEpoch [150/200], Test Loss: 3.1672, Test Accuracy: 48.40%\nEpoch [151/200], Test Loss: 3.1741, Test Accuracy: 48.39%\nEpoch [152/200], Test Loss: 3.1720, Test Accuracy: 48.66%\nEpoch [153/200], Test Loss: 3.1725, Test Accuracy: 48.31%\nEpoch [154/200], Test Loss: 3.1792, Test Accuracy: 48.71%\nEpoch [155/200], Test Loss: 3.1662, Test Accuracy: 48.30%\nEpoch [156/200], Test Loss: 3.1813, Test Accuracy: 48.47%\nEpoch [157/200], Test Loss: 3.1810, Test Accuracy: 48.68%\nEpoch [158/200], Test Loss: 3.1788, Test Accuracy: 48.60%\nEpoch [159/200], Test Loss: 3.1780, Test Accuracy: 48.57%\nEpoch [160/200], Test Loss: 3.1779, Test Accuracy: 48.60%\nEpoch [161/200], Test Loss: 3.1811, Test Accuracy: 48.74%\nEpoch [162/200], Test Loss: 3.1731, Test Accuracy: 48.65%\nEpoch [163/200], Test Loss: 3.1793, Test Accuracy: 48.59%\nEpoch [164/200], Test Loss: 3.1750, Test Accuracy: 48.56%\nEpoch [165/200], Test Loss: 3.1756, Test Accuracy: 48.56%\nEpoch [166/200], Test Loss: 3.1794, Test Accuracy: 48.73%\nEpoch [167/200], Test Loss: 3.1787, Test Accuracy: 48.57%\nEpoch [168/200], Test Loss: 3.1794, Test Accuracy: 48.65%\nEpoch [169/200], Test Loss: 3.1815, Test Accuracy: 48.57%\nEpoch [170/200], Test Loss: 3.1820, Test Accuracy: 48.44%\nEpoch [171/200], Test Loss: 3.1805, Test Accuracy: 48.62%\nEpoch [172/200], Test Loss: 3.1764, Test Accuracy: 48.55%\nEpoch [173/200], Test Loss: 3.1749, Test Accuracy: 48.53%\nEpoch [174/200], Test Loss: 3.1759, Test Accuracy: 48.61%\nEpoch [175/200], Test Loss: 3.1700, Test Accuracy: 48.57%\nEpoch [176/200], Test Loss: 3.1830, Test Accuracy: 48.64%\nEpoch [177/200], Test Loss: 3.1763, Test Accuracy: 48.64%\nEpoch [178/200], Test Loss: 3.1778, Test Accuracy: 48.47%\nEpoch [179/200], Test Loss: 3.1797, Test Accuracy: 48.53%\nEpoch [180/200], Test Loss: 3.1801, Test Accuracy: 48.58%\nEpoch [181/200], Test Loss: 3.1814, Test Accuracy: 48.68%\nEpoch [182/200], Test Loss: 3.1841, Test Accuracy: 48.56%\nEpoch [183/200], Test Loss: 3.1814, Test Accuracy: 48.61%\nEpoch [184/200], Test Loss: 3.1857, Test Accuracy: 48.67%\nEpoch [185/200], Test Loss: 3.1826, Test Accuracy: 48.49%\nEpoch [186/200], Test Loss: 3.1786, Test Accuracy: 48.59%\nEpoch [187/200], Test Loss: 3.1859, Test Accuracy: 48.44%\nEpoch [188/200], Test Loss: 3.1810, Test Accuracy: 48.70%\nEpoch [189/200], Test Loss: 3.1839, Test Accuracy: 48.65%\nEpoch [190/200], Test Loss: 3.1773, Test Accuracy: 48.55%\nEpoch [191/200], Test Loss: 3.1833, Test Accuracy: 48.65%\nEpoch [192/200], Test Loss: 3.1809, Test Accuracy: 48.50%\nEpoch [193/200], Test Loss: 3.1841, Test Accuracy: 48.64%\nEpoch [194/200], Test Loss: 3.1811, Test Accuracy: 48.62%\nEpoch [195/200], Test Loss: 3.1835, Test Accuracy: 48.57%\nEpoch [196/200], Test Loss: 3.1867, Test Accuracy: 48.48%\nEpoch [197/200], Test Loss: 3.1761, Test Accuracy: 48.63%\nEpoch [198/200], Test Loss: 3.1782, Test Accuracy: 48.61%\nEpoch [199/200], Test Loss: 3.1775, Test Accuracy: 48.66%\nEpoch [200/200], Test Loss: 3.1850, Test Accuracy: 48.69%\n","output_type":"stream"}]},{"cell_type":"code","source":"!mkdir /kaggle/working/coopth","metadata":{"execution":{"iopub.status.busy":"2023-05-27T18:40:20.406186Z","iopub.execute_input":"2023-05-27T18:40:20.406948Z","iopub.status.idle":"2023-05-27T18:40:21.394099Z","shell.execute_reply.started":"2023-05-27T18:40:20.406906Z","shell.execute_reply":"2023-05-27T18:40:21.392828Z"},"trusted":true},"execution_count":20,"outputs":[]},{"cell_type":"code","source":"# Save the model\nPATH = '/kaggle/working/coo_figure/cifar_coordinate_atttion4.pth'\ntorch.save(model.state_dict(), PATH)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T18:40:21.396113Z","iopub.execute_input":"2023-05-27T18:40:21.396480Z","iopub.status.idle":"2023-05-27T18:40:22.297995Z","shell.execute_reply.started":"2023-05-27T18:40:21.396443Z","shell.execute_reply":"2023-05-27T18:40:22.296617Z"},"trusted":true},"execution_count":21,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mRuntimeError\u001b[0m                              Traceback (most recent call last)","Cell \u001b[0;32mIn[21], line 3\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;66;03m# Save the model\u001b[39;00m\n\u001b[1;32m      2\u001b[0m PATH \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/kaggle/working/coo_figure/cifar_coordinate_atttion4.pth\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[0;32m----> 3\u001b[0m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstate_dict\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mPATH\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/serialization.py:440\u001b[0m, in \u001b[0;36msave\u001b[0;34m(obj, f, pickle_module, pickle_protocol, _use_new_zipfile_serialization)\u001b[0m\n\u001b[1;32m    437\u001b[0m _check_save_filelike(f)\n\u001b[1;32m    439\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _use_new_zipfile_serialization:\n\u001b[0;32m--> 440\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43m_open_zipfile_writer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m opened_zipfile:\n\u001b[1;32m    441\u001b[0m         _save(obj, opened_zipfile, pickle_module, pickle_protocol)\n\u001b[1;32m    442\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/serialization.py:315\u001b[0m, in \u001b[0;36m_open_zipfile_writer\u001b[0;34m(name_or_buffer)\u001b[0m\n\u001b[1;32m    313\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m    314\u001b[0m     container \u001b[38;5;241m=\u001b[39m _open_zipfile_writer_buffer\n\u001b[0;32m--> 315\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcontainer\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname_or_buffer\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/torch/serialization.py:288\u001b[0m, in \u001b[0;36m_open_zipfile_writer_file.__init__\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m    287\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 288\u001b[0m     \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m(\u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_C\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mPyTorchFileWriter\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mstr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m)\n","\u001b[0;31mRuntimeError\u001b[0m: Parent directory /kaggle/working/coo_figure does not exist."],"ename":"RuntimeError","evalue":"Parent directory /kaggle/working/coo_figure does not exist.","output_type":"error"}]},{"cell_type":"code","source":"# Evaluation on the test set\nmodel.eval()\ntest_loss = 0.0\ntest_total = 0\ntest_correct = 0\n\nwith torch.no_grad():\n    for images, labels in test_loader:\n        images = images.to(device)\n        labels = labels.to(device)\n\n        # Forward pass\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n\n        test_loss += loss.item()\n        _, predicted = torch.max(outputs.data, 1)\n        test_total += labels.size(0)\n        test_correct += (predicted == labels).sum().item()\n\ntest_acc = 100.0 * test_correct / test_total\ntest_losses.append(test_loss / len(test_loader))\ntest_accs.append(test_acc)\n\n# Print test accuracy for the current epoch\nprint(f\"Test Accuracy of the model on the {len(test_loader.dataset)} test images: {test_acc:.2f}%\")\n\n# Switch back to training mode\nmodel.train()","metadata":{"execution":{"iopub.status.busy":"2023-05-26T02:33:33.289500Z","iopub.execute_input":"2023-05-26T02:33:33.289898Z","iopub.status.idle":"2023-05-26T02:33:36.832934Z","shell.execute_reply.started":"2023-05-26T02:33:33.289861Z","shell.execute_reply":"2023-05-26T02:33:36.831802Z"},"trusted":true},"execution_count":13,"outputs":[{"name":"stdout","text":"Test Accuracy of the model on the 10000 test images: 38.36%\n","output_type":"stream"},{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"MBV2_CA(\n  (features): Sequential(\n    (0): Sequential(\n      (0): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n      (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      (2): ReLU6(inplace=True)\n    )\n    (1): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32, bias=False)\n        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(32, 16, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (4): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (2): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(16, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=96, bias=False)\n        (4): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(96, 8, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(8, 96, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(8, 96, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(96, 24, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(24, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (3): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(24, 144, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(144, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(144, 144, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=144, bias=False)\n        (4): BatchNorm2d(144, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(144, 8, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(8, 144, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(8, 144, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(144, 24, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(24, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (4): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(24, 144, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(144, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(144, 144, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=144, bias=False)\n        (4): BatchNorm2d(144, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(144, 8, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(8, 144, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(8, 144, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(144, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (5): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=192, bias=False)\n        (4): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(192, 8, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(8, 192, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(8, 192, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (6): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=192, bias=False)\n        (4): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(192, 8, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(8, 192, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(8, 192, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (7): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(32, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(192, 192, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=192, bias=False)\n        (4): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(192, 8, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(8, 192, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(8, 192, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (8): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(64, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=384, bias=False)\n        (4): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(384, 12, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(12, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(12, 384, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(12, 384, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(384, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (9): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(64, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=384, bias=False)\n        (4): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(384, 12, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(12, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(12, 384, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(12, 384, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(384, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (10): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(64, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=384, bias=False)\n        (4): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(384, 12, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(12, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(12, 384, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(12, 384, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(384, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (11): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(64, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=384, bias=False)\n        (4): BatchNorm2d(384, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(384, 12, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(12, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(12, 384, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(12, 384, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(384, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (12): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(96, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(576, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(576, 576, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=576, bias=False)\n        (4): BatchNorm2d(576, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(576, 18, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(18, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(18, 576, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(18, 576, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(576, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (13): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(96, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(576, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(576, 576, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=576, bias=False)\n        (4): BatchNorm2d(576, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(576, 18, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(18, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(18, 576, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(18, 576, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(576, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (14): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(96, 576, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(576, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(576, 576, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=576, bias=False)\n        (4): BatchNorm2d(576, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(576, 18, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(18, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(18, 576, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(18, 576, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(576, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (15): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(160, 960, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(960, 960, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=960, bias=False)\n        (4): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(960, 30, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(30, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(30, 960, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(30, 960, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(960, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (16): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(160, 960, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(960, 960, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=960, bias=False)\n        (4): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(960, 30, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(30, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(30, 960, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(30, 960, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(960, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(160, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n    (17): InvertedResidual(\n      (conv): Sequential(\n        (0): Conv2d(160, 960, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (1): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (2): ReLU6(inplace=True)\n        (3): Conv2d(960, 960, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=960, bias=False)\n        (4): BatchNorm2d(960, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n        (5): ReLU6(inplace=True)\n        (6): CoordAtt(\n          (pool_h): AdaptiveAvgPool2d(output_size=(None, 1))\n          (pool_w): AdaptiveAvgPool2d(output_size=(1, None))\n          (conv1): Conv2d(960, 30, kernel_size=(1, 1), stride=(1, 1))\n          (bn1): BatchNorm2d(30, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n          (conv2): Conv2d(30, 960, kernel_size=(1, 1), stride=(1, 1))\n          (conv3): Conv2d(30, 960, kernel_size=(1, 1), stride=(1, 1))\n          (relu): h_swish(\n            (sigmoid): h_sigmoid(\n              (relu): ReLU6(inplace=True)\n            )\n          )\n        )\n        (7): Conv2d(960, 320, kernel_size=(1, 1), stride=(1, 1), bias=False)\n        (8): BatchNorm2d(320, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n      )\n    )\n  )\n  (conv): Sequential(\n    (0): Conv2d(320, 1280, kernel_size=(1, 1), stride=(1, 1), bias=False)\n    (1): BatchNorm2d(1280, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n    (2): ReLU6(inplace=True)\n  )\n  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))\n  (classifier): Sequential(\n    (0): Dropout(p=0.1, inplace=False)\n    (1): Linear(in_features=1280, out_features=100, bias=True)\n  )\n)"},"metadata":{}}]},{"cell_type":"code","source":"!mkdir /kaggle/working/coo_figure","metadata":{"execution":{"iopub.status.busy":"2023-05-27T18:40:22.301443Z","iopub.status.idle":"2023-05-27T18:40:22.302265Z","shell.execute_reply.started":"2023-05-27T18:40:22.301993Z","shell.execute_reply":"2023-05-27T18:40:22.302019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(len( test_losses))","metadata":{"execution":{"iopub.status.busy":"2023-05-27T11:25:21.530486Z","iopub.execute_input":"2023-05-27T11:25:21.530850Z","iopub.status.idle":"2023-05-27T11:25:21.536518Z","shell.execute_reply.started":"2023-05-27T11:25:21.530824Z","shell.execute_reply":"2023-05-27T11:25:21.535549Z"},"trusted":true},"execution_count":20,"outputs":[{"name":"stdout","text":"200\n","output_type":"stream"}]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n# Plot the training and testing losses\nplt.figure(figsize=(12, 5))\nplt.plot(range(1, num_epochs+1), train_losses, label='Training Loss')\nplt.plot(range(1, num_epochs +1 ), test_losses, label='Testing Loss')\nplt.xlabel('Epoch')\nplt.ylabel('Loss')\nplt.title('Training and Testing Loss')\nplt.legend()\nplt.savefig(\"/kaggle/working/coo_figure/5_25_50epochs_losses.png\")\nplt.show()\n\n# Plot the training and testing acc\nplt.figure(figsize=(12, 5))\nplt.plot(range(1, num_epochs+1 ), train_accs, label='Training Accuracy')\nplt.plot(range(1, num_epochs + 1), test_accs, label='Testing Accuracy')\nplt.xlabel('Epoch')\nplt.ylabel('Accuracy')\nplt.title('Training and Testing Accuracy')\nplt.legend()\nplt.savefig(\"/kaggle/working/coo_figure/5_25_50epochs_accs.png\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-05-27T18:40:22.299285Z","iopub.status.idle":"2023-05-27T18:40:22.300025Z","shell.execute_reply.started":"2023-05-27T18:40:22.299744Z","shell.execute_reply":"2023-05-27T18:40:22.299771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"!pip install scikit-surprise","metadata":{}},{"cell_type":"code","source":"from surprise import SVDpp,SVD\nfrom surprise import Dataset, Reader, accuracy\nfrom surprise.model_selection import train_test_split\nimport pandas as pd\n","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:06:01.173171Z","iopub.execute_input":"2023-05-27T15:06:01.173514Z","iopub.status.idle":"2023-05-27T15:06:01.178105Z","shell.execute_reply.started":"2023-05-27T15:06:01.173485Z","shell.execute_reply":"2023-05-27T15:06:01.177277Z"},"trusted":true},"execution_count":20,"outputs":[]},{"cell_type":"code","source":"!cp /kaggle/input/train-data/推荐系统编程大作业/data/data/train.txt /kaggle/working/train.txt","metadata":{"execution":{"iopub.status.busy":"2023-05-27T14:43:01.674320Z","iopub.execute_input":"2023-05-27T14:43:01.674675Z","iopub.status.idle":"2023-05-27T14:43:03.570276Z","shell.execute_reply.started":"2023-05-27T14:43:01.674645Z","shell.execute_reply":"2023-05-27T14:43:03.569028Z"},"trusted":true},"execution_count":5,"outputs":[]},{"cell_type":"code","source":"!cp /kaggle/input/train-data/推荐系统编程大作业/data/data/test.txt /kaggle/working/test.txt","metadata":{"execution":{"iopub.status.busy":"2023-05-27T14:43:16.021626Z","iopub.execute_input":"2023-05-27T14:43:16.022028Z","iopub.status.idle":"2023-05-27T14:43:17.312367Z","shell.execute_reply.started":"2023-05-27T14:43:16.021993Z","shell.execute_reply":"2023-05-27T14:43:17.311020Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"# 读取训练数据\ntrain_data = []\nwith open('train.txt', 'r') as f:\n    for line in f:\n        user_id, n_items = line.strip().split('|')\n        for _ in range(int(n_items)):\n            item_id, score = next(f).strip().split()\n            train_data.append([user_id, item_id, float(score)])","metadata":{"execution":{"iopub.status.busy":"2023-05-27T14:43:26.942273Z","iopub.execute_input":"2023-05-27T14:43:26.942708Z","iopub.status.idle":"2023-05-27T14:43:37.998294Z","shell.execute_reply.started":"2023-05-27T14:43:26.942669Z","shell.execute_reply":"2023-05-27T14:43:37.997261Z"},"trusted":true},"execution_count":7,"outputs":[]},{"cell_type":"code","source":"train_data","metadata":{"execution":{"iopub.status.busy":"2023-05-27T14:43:51.004677Z","iopub.execute_input":"2023-05-27T14:43:51.005111Z","iopub.status.idle":"2023-05-27T14:43:51.086343Z","shell.execute_reply.started":"2023-05-27T14:43:51.005082Z","shell.execute_reply":"2023-05-27T14:43:51.085443Z"},"trusted":true},"execution_count":8,"outputs":[{"execution_count":8,"output_type":"execute_result","data":{"text/plain":"[['0', '518385', 100.0],\n ['0', '550452', 90.0],\n ['0', '600770', 80.0],\n ['0', '194044', 90.0],\n ['0', '295315', 90.0],\n ['0', '127640', 50.0],\n ['0', '192496', 90.0],\n ['0', '531386', 80.0],\n ['0', '123025', 90.0],\n ['0', '147073', 80.0],\n ['0', '137915', 90.0],\n ['0', '497792', 90.0],\n ['0', '459622', 90.0],\n ['0', '392726', 90.0],\n ['0', '70896', 100.0],\n ['0', '507010', 90.0],\n ['0', '113323', 50.0],\n ['0', '554099', 100.0],\n ['0', '205234', 90.0],\n ['0', '507696', 90.0],\n ['0', '453488', 90.0],\n ['0', '450906', 90.0],\n ['0', '22757', 90.0],\n ['0', '438303', 0.0],\n ['0', '159248', 100.0],\n ['0', '277277', 90.0],\n ['0', '94522', 0.0],\n ['0', '26137', 70.0],\n ['0', '120328', 90.0],\n ['0', '175835', 90.0],\n ['0', '131263', 90.0],\n ['0', '578821', 90.0],\n ['0', '452599', 50.0],\n ['0', '180037', 90.0],\n ['0', '592747', 70.0],\n ['0', '461814', 90.0],\n ['0', '9101', 90.0],\n ['0', '522229', 0.0],\n ['0', '608376', 90.0],\n ['0', '325346', 90.0],\n ['0', '323933', 100.0],\n ['1', '205234', 90.0],\n ['1', '112273', 90.0],\n ['1', '119154', 90.0],\n ['1', '255153', 90.0],\n ['1', '270248', 90.0],\n ['1', '173094', 90.0],\n ['1', '75445', 90.0],\n ['1', '569179', 90.0],\n ['1', '375693', 90.0],\n ['1', '25311', 90.0],\n ['1', '371598', 90.0],\n ['1', '402723', 90.0],\n ['1', '248550', 90.0],\n ['1', '196203', 90.0],\n ['1', '207030', 90.0],\n ['1', '546722', 90.0],\n ['1', '79902', 90.0],\n ['1', '567726', 90.0],\n ['1', '390355', 90.0],\n ['1', '210226', 90.0],\n ['1', '490684', 90.0],\n ['1', '21931', 90.0],\n ['1', '591590', 90.0],\n ['1', '440749', 90.0],\n ['1', '616649', 90.0],\n ['1', '23521', 90.0],\n ['1', '234212', 90.0],\n ['1', '541988', 90.0],\n ['1', '283541', 90.0],\n ['1', '497792', 90.0],\n ['1', '489371', 90.0],\n ['1', '383195', 90.0],\n ['1', '10843', 90.0],\n ['1', '528144', 90.0],\n ['1', '153809', 90.0],\n ['1', '97762', 90.0],\n ['1', '294427', 90.0],\n ['1', '454436', 90.0],\n ['1', '288560', 90.0],\n ['1', '491757', 90.0],\n ['1', '190019', 90.0],\n ['1', '445735', 90.0],\n ['1', '200053', 90.0],\n ['1', '158948', 90.0],\n ['1', '213829', 90.0],\n ['1', '322770', 90.0],\n ['1', '263294', 90.0],\n ['1', '124428', 90.0],\n ['1', '517718', 90.0],\n ['1', '569785', 90.0],\n ['1', '47888', 90.0],\n ['1', '197656', 90.0],\n ['1', '56970', 90.0],\n ['1', '191809', 90.0],\n ['1', '410606', 90.0],\n ['1', '40476', 90.0],\n ['1', '507010', 90.0],\n ['1', '199439', 90.0],\n ['1', '55629', 90.0],\n ['1', '580720', 90.0],\n ['1', '113017', 90.0],\n ['1', '482069', 90.0],\n ['1', '173301', 90.0],\n ['1', '147073', 80.0],\n ['1', '454149', 90.0],\n ['1', '440901', 90.0],\n ['1', '39975', 90.0],\n ['1', '123601', 80.0],\n ['1', '34947', 90.0],\n ['1', '219322', 90.0],\n ['1', '181079', 90.0],\n ['1', '540934', 90.0],\n ['1', '46759', 90.0],\n ['1', '392726', 90.0],\n ['1', '192496', 90.0],\n ['1', '225587', 90.0],\n ['1', '504528', 90.0],\n ['1', '185665', 90.0],\n ['1', '275261', 90.0],\n ['1', '235250', 90.0],\n ['1', '146781', 90.0],\n ['1', '189820', 90.0],\n ['1', '134437', 90.0],\n ['1', '227064', 90.0],\n ['1', '185095', 90.0],\n ['1', '199467', 90.0],\n ['1', '363219', 90.0],\n ['1', '259552', 90.0],\n ['1', '120328', 90.0],\n ['1', '453396', 90.0],\n ['1', '137915', 90.0],\n ['1', '558154', 90.0],\n ['1', '514730', 90.0],\n ['1', '179785', 90.0],\n ['1', '567378', 90.0],\n ['1', '428598', 90.0],\n ['1', '136867', 90.0],\n ['1', '614243', 90.0],\n ['1', '67136', 90.0],\n ['1', '550452', 90.0],\n ['1', '507696', 90.0],\n ['1', '398037', 90.0],\n ['1', '477870', 90.0],\n ['1', '22757', 90.0],\n ['1', '481274', 90.0],\n ['1', '566644', 90.0],\n ['1', '195167', 90.0],\n ['1', '46539', 90.0],\n ['1', '325936', 90.0],\n ['1', '112642', 90.0],\n ['1', '344617', 90.0],\n ['1', '261386', 90.0],\n ['1', '457583', 90.0],\n ['1', '466895', 90.0],\n ['1', '323933', 90.0],\n ['1', '460065', 90.0],\n ['1', '123260', 90.0],\n ['1', '186098', 90.0],\n ['1', '587636', 90.0],\n ['1', '436056', 90.0],\n ['1', '230673', 90.0],\n ['1', '288340', 90.0],\n ['1', '349771', 90.0],\n ['1', '583222', 90.0],\n ['1', '70896', 90.0],\n ['1', '257310', 90.0],\n ['1', '161901', 90.0],\n ['1', '297989', 90.0],\n ['1', '196852', 90.0],\n ['1', '95689', 90.0],\n ['1', '140118', 90.0],\n ['1', '41693', 90.0],\n ['1', '280245', 90.0],\n ['1', '205871', 90.0],\n ['1', '324045', 90.0],\n ['1', '381411', 90.0],\n ['1', '74262', 90.0],\n ['1', '516754', 90.0],\n ['1', '463859', 90.0],\n ['1', '451800', 90.0],\n ['1', '503258', 90.0],\n ['1', '417011', 90.0],\n ['1', '502177', 90.0],\n ['1', '578821', 90.0],\n ['1', '219179', 90.0],\n ['1', '491417', 90.0],\n ['1', '75757', 90.0],\n ['1', '318345', 90.0],\n ['1', '548098', 90.0],\n ['1', '188078', 90.0],\n ['1', '248699', 90.0],\n ['1', '111411', 90.0],\n ['1', '532569', 90.0],\n ['1', '423102', 90.0],\n ['1', '490754', 90.0],\n ['1', '493655', 90.0],\n ['1', '361313', 90.0],\n ['1', '577309', 90.0],\n ['1', '318901', 90.0],\n ['1', '56437', 90.0],\n ['1', '1996', 90.0],\n ['1', '176588', 90.0],\n ['1', '457354', 90.0],\n ['1', '2255', 90.0],\n ['1', '568182', 90.0],\n ['1', '310379', 90.0],\n ['1', '543790', 90.0],\n ['1', '105502', 90.0],\n ['1', '574204', 90.0],\n ['1', '431048', 90.0],\n ['1', '142979', 90.0],\n ['1', '254519', 90.0],\n ['1', '304287', 90.0],\n ['1', '238223', 90.0],\n ['1', '85222', 90.0],\n ['1', '534596', 90.0],\n ['1', '249902', 90.0],\n ['1', '387522', 90.0],\n ['1', '248089', 90.0],\n ['1', '71149', 90.0],\n ['1', '556366', 90.0],\n ['1', '131721', 90.0],\n ['1', '349250', 90.0],\n ['1', '123025', 90.0],\n ['1', '620594', 90.0],\n ['1', '354153', 90.0],\n ['1', '34525', 90.0],\n ['1', '102328', 90.0],\n ['1', '18260', 90.0],\n ['1', '366723', 90.0],\n ['1', '539126', 90.0],\n ['1', '521369', 90.0],\n ['1', '153097', 90.0],\n ['1', '224051', 90.0],\n ['1', '237610', 90.0],\n ['1', '156663', 90.0],\n ['1', '235966', 90.0],\n ['1', '194044', 90.0],\n ['1', '492607', 90.0],\n ['1', '397543', 90.0],\n ['1', '556458', 90.0],\n ['1', '546992', 90.0],\n ['1', '359811', 90.0],\n ['1', '129462', 90.0],\n ['1', '622325', 90.0],\n ['1', '18519', 90.0],\n ['1', '532453', 90.0],\n ['1', '623778', 90.0],\n ['1', '327881', 90.0],\n ['1', '19106', 90.0],\n ['1', '180037', 90.0],\n ['1', '488803', 90.0],\n ['1', '397620', 90.0],\n ['1', '131263', 90.0],\n ['1', '442074', 90.0],\n ['1', '288237', 90.0],\n ['1', '393059', 80.0],\n ['1', '470248', 90.0],\n ['1', '408557', 90.0],\n ['1', '325346', 90.0],\n ['1', '295315', 90.0],\n ['1', '601402', 90.0],\n ['1', '182140', 90.0],\n ['1', '269414', 90.0],\n ['1', '222533', 90.0],\n ['1', '121743', 90.0],\n ['1', '459622', 90.0],\n ['1', '425182', 90.0],\n ['1', '418175', 90.0],\n ['2', '336502', 0.0],\n ['2', '320706', 0.0],\n ['2', '525493', 0.0],\n ['2', '600770', 0.0],\n ['2', '181585', 0.0],\n ['2', '419241', 0.0],\n ['2', '364374', 100.0],\n ['2', '315452', 0.0],\n ['2', '57422', 0.0],\n ['2', '534002', 0.0],\n ['2', '4283', 0.0],\n ['2', '342087', 100.0],\n ['2', '599530', 0.0],\n ['2', '12332', 100.0],\n ['2', '210761', 100.0],\n ['2', '190762', 0.0],\n ['2', '119752', 0.0],\n ['2', '329058', 100.0],\n ['2', '13896', 0.0],\n ['2', '246957', 0.0],\n ['2', '427139', 0.0],\n ['2', '532569', 90.0],\n ['2', '523223', 0.0],\n ['2', '602548', 0.0],\n ['2', '510603', 100.0],\n ['2', '188675', 100.0],\n ['2', '257158', 0.0],\n ['2', '176889', 100.0],\n ['2', '85012', 100.0],\n ['2', '106447', 0.0],\n ['2', '78477', 100.0],\n ['2', '99935', 100.0],\n ['2', '507377', 100.0],\n ['2', '382315', 0.0],\n ['2', '258003', 100.0],\n ['2', '532650', 100.0],\n ['2', '115200', 100.0],\n ['2', '521716', 0.0],\n ['2', '66765', 100.0],\n ['2', '180618', 100.0],\n ['2', '602243', 100.0],\n ['2', '27499', 100.0],\n ['2', '181286', 0.0],\n ['2', '316815', 100.0],\n ['2', '121082', 100.0],\n ['2', '370371', 0.0],\n ['2', '211566', 0.0],\n ['2', '488564', 100.0],\n ['2', '5237', 100.0],\n ['2', '297989', 0.0],\n ['2', '296155', 100.0],\n ['2', '333784', 100.0],\n ['2', '538823', 0.0],\n ['2', '319866', 100.0],\n ['2', '155330', 0.0],\n ['2', '57791', 100.0],\n ['2', '563692', 0.0],\n ['2', '344158', 100.0],\n ['2', '303423', 0.0],\n ['2', '484497', 0.0],\n ['2', '419748', 100.0],\n ['2', '533639', 100.0],\n ['2', '247563', 0.0],\n ['2', '92066', 0.0],\n ['2', '268555', 100.0],\n ['2', '142902', 0.0],\n ['2', '402792', 100.0],\n ['2', '557544', 100.0],\n ['2', '531386', 0.0],\n ['2', '120443', 0.0],\n ['2', '517337', 100.0],\n ['2', '528002', 100.0],\n ['2', '217921', 100.0],\n ['2', '456895', 100.0],\n ['2', '155522', 0.0],\n ['2', '386887', 0.0],\n ['2', '21683', 0.0],\n ['2', '509188', 0.0],\n ['2', '377333', 100.0],\n ['2', '387982', 100.0],\n ['2', '144592', 0.0],\n ['2', '475878', 100.0],\n ['2', '235514', 0.0],\n ['2', '182489', 100.0],\n ['2', '224595', 0.0],\n ['2', '145897', 0.0],\n ['2', '406012', 0.0],\n ['2', '556298', 0.0],\n ['2', '16249', 100.0],\n ['2', '445463', 0.0],\n ['2', '92450', 100.0],\n ['2', '349451', 0.0],\n ['2', '525951', 100.0],\n ['2', '528166', 0.0],\n ['2', '29323', 100.0],\n ['2', '242450', 100.0],\n ['2', '103338', 0.0],\n ['2', '43628', 100.0],\n ['2', '283332', 0.0],\n ['2', '367509', 100.0],\n ['2', '428863', 100.0],\n ['3', '11059', 90.0],\n ['3', '175835', 90.0],\n ['3', '230010', 90.0],\n ['3', '74262', 90.0],\n ['3', '290303', 90.0],\n ['3', '180037', 90.0],\n ['3', '366723', 90.0],\n ['3', '5980', 90.0],\n ['3', '418340', 90.0],\n ['3', '146781', 90.0],\n ['3', '266898', 80.0],\n ['3', '541471', 90.0],\n ['3', '489371', 90.0],\n ['3', '577089', 80.0],\n ['4', '83676', 10.0],\n ['4', '613582', 80.0],\n ['4', '19503', 60.0],\n ['4', '397543', 40.0],\n ['4', '168480', 70.0],\n ['4', '161279', 40.0],\n ['4', '9982', 80.0],\n ['4', '333773', 70.0],\n ['4', '569497', 70.0],\n ['4', '206744', 60.0],\n ['4', '606576', 90.0],\n ['4', '33455', 70.0],\n ['4', '400058', 50.0],\n ['4', '302349', 90.0],\n ['4', '28696', 60.0],\n ['4', '60117', 10.0],\n ['4', '296497', 50.0],\n ['4', '386964', 70.0],\n ['4', '586623', 0.0],\n ['4', '354153', 60.0],\n ['4', '532569', 30.0],\n ['4', '612797', 80.0],\n ['4', '97855', 60.0],\n ['4', '428105', 70.0],\n ['4', '161704', 70.0],\n ['4', '48668', 60.0],\n ['4', '442658', 0.0],\n ['4', '209121', 0.0],\n ['4', '606671', 70.0],\n ['4', '262824', 90.0],\n ['4', '336296', 80.0],\n ['4', '434567', 70.0],\n ['4', '139200', 90.0],\n ['4', '529175', 80.0],\n ['4', '248550', 70.0],\n ['4', '459622', 0.0],\n ['4', '294536', 70.0],\n ['4', '206975', 70.0],\n ['4', '571214', 70.0],\n ['4', '273828', 0.0],\n ['4', '523236', 70.0],\n ['4', '608000', 70.0],\n ['4', '308414', 60.0],\n ['4', '561044', 90.0],\n ['4', '339962', 80.0],\n ['4', '304395', 70.0],\n ['4', '230865', 60.0],\n ['4', '322134', 70.0],\n ['4', '521818', 90.0],\n ['4', '141590', 60.0],\n ['4', '424363', 90.0],\n ['4', '179672', 60.0],\n ['4', '269642', 90.0],\n ['4', '24214', 30.0],\n ['4', '586109', 70.0],\n ['4', '494057', 80.0],\n ['4', '18641', 80.0],\n ['4', '351075', 80.0],\n ['4', '599652', 0.0],\n ['4', '211658', 0.0],\n ['4', '488440', 50.0],\n ['4', '577180', 70.0],\n ['4', '279399', 70.0],\n ['4', '532117', 60.0],\n ['4', '600723', 90.0],\n ['4', '304959', 70.0],\n ['4', '296928', 80.0],\n ['4', '12311', 70.0],\n ['4', '284221', 70.0],\n ['4', '283541', 60.0],\n ['4', '563449', 60.0],\n ['4', '195833', 60.0],\n ['4', '44399', 90.0],\n ['4', '312845', 50.0],\n ['4', '614131', 90.0],\n ['4', '544464', 70.0],\n ['4', '360153', 70.0],\n ['4', '82251', 0.0],\n ['4', '18361', 10.0],\n ['4', '128261', 50.0],\n ['4', '19805', 70.0],\n ['4', '296188', 60.0],\n ['4', '97316', 90.0],\n ['4', '532477', 70.0],\n ['4', '294951', 70.0],\n ['4', '615774', 80.0],\n ['4', '531379', 90.0],\n ['4', '371598', 50.0],\n ['4', '411099', 80.0],\n ['4', '541819', 90.0],\n ['4', '214626', 90.0],\n ['4', '520195', 90.0],\n ['4', '404871', 70.0],\n ['4', '433933', 0.0],\n ['4', '182084', 60.0],\n ['4', '49226', 80.0],\n ['4', '838', 60.0],\n ['4', '98718', 70.0],\n ['4', '301941', 70.0],\n ['4', '124928', 90.0],\n ['4', '538851', 70.0],\n ['4', '556350', 0.0],\n ['4', '2414', 90.0],\n ['4', '133677', 0.0],\n ['4', '470675', 70.0],\n ['4', '243145', 80.0],\n ['4', '311856', 70.0],\n ['4', '523227', 70.0],\n ['4', '64154', 60.0],\n ['4', '74262', 70.0],\n ['4', '473071', 90.0],\n ['4', '456935', 70.0],\n ['4', '523255', 80.0],\n ['4', '311587', 70.0],\n ['4', '586837', 90.0],\n ['4', '602876', 80.0],\n ['4', '85425', 10.0],\n ['4', '395438', 0.0],\n ['4', '544999', 60.0],\n ['4', '596241', 0.0],\n ['4', '623749', 0.0],\n ['4', '412390', 80.0],\n ['4', '149241', 90.0],\n ['4', '565755', 90.0],\n ['4', '282465', 70.0],\n ['4', '436056', 80.0],\n ['4', '141286', 90.0],\n ['4', '621208', 90.0],\n ['4', '551350', 70.0],\n ['4', '352015', 80.0],\n ['4', '284575', 50.0],\n ['4', '513413', 0.0],\n ['4', '379038', 90.0],\n ['4', '136075', 60.0],\n ['4', '469501', 60.0],\n ['4', '588686', 50.0],\n ['4', '550615', 80.0],\n ['4', '364441', 60.0],\n ['4', '25404', 100.0],\n ['4', '54506', 70.0],\n ['4', '229314', 70.0],\n ['4', '169708', 10.0],\n ['4', '533829', 80.0],\n ['4', '313340', 60.0],\n ['4', '369623', 80.0],\n ['4', '416664', 0.0],\n ['4', '239721', 70.0],\n ['4', '520702', 60.0],\n ['4', '592141', 90.0],\n ['4', '277323', 70.0],\n ['4', '414265', 80.0],\n ['4', '433610', 10.0],\n ['4', '574204', 90.0],\n ['4', '578559', 80.0],\n ['4', '392167', 90.0],\n ['4', '359636', 70.0],\n ['4', '296938', 60.0],\n ['4', '166998', 80.0],\n ['4', '135864', 70.0],\n ['4', '282398', 70.0],\n ['4', '21244', 80.0],\n ['4', '549358', 70.0],\n ['4', '442284', 0.0],\n ['4', '59539', 70.0],\n ['4', '50536', 70.0],\n ['4', '127468', 80.0],\n ['4', '583845', 0.0],\n ['4', '332630', 60.0],\n ['4', '355727', 50.0],\n ['4', '425866', 70.0],\n ['4', '522336', 80.0],\n ['4', '256148', 60.0],\n ['4', '505508', 90.0],\n ['4', '572660', 90.0],\n ['4', '44035', 70.0],\n ['4', '242287', 70.0],\n ['4', '365977', 40.0],\n ['4', '306084', 0.0],\n ['4', '502414', 80.0],\n ['4', '539938', 50.0],\n ['4', '10669', 60.0],\n ['4', '53156', 70.0],\n ['4', '294427', 70.0],\n ['4', '191936', 60.0],\n ['4', '276035', 70.0],\n ['4', '56437', 0.0],\n ['4', '206721', 60.0],\n ['4', '455827', 60.0],\n ['4', '502352', 90.0],\n ['4', '617491', 50.0],\n ['4', '21063', 0.0],\n ['4', '427973', 70.0],\n ['4', '142756', 0.0],\n ['4', '257962', 70.0],\n ['4', '296429', 90.0],\n ['4', '146397', 90.0],\n ['4', '496940', 0.0],\n ['4', '582836', 90.0],\n ['4', '561982', 0.0],\n ['4', '140753', 10.0],\n ['4', '503258', 0.0],\n ['4', '617405', 90.0],\n ['4', '617715', 70.0],\n ['4', '135908', 80.0],\n ['4', '111214', 90.0],\n ['4', '162325', 80.0],\n ['4', '534444', 80.0],\n ['4', '250111', 60.0],\n ['4', '186901', 60.0],\n ['4', '64130', 60.0],\n ['4', '435892', 80.0],\n ['4', '46801', 80.0],\n ['4', '566294', 10.0],\n ['4', '583090', 80.0],\n ['4', '407777', 0.0],\n ['4', '317875', 70.0],\n ['4', '201378', 30.0],\n ['4', '213829', 60.0],\n ['4', '597811', 90.0],\n ['4', '526178', 50.0],\n ['4', '158666', 60.0],\n ['4', '140501', 70.0],\n ['4', '8103', 20.0],\n ['4', '227064', 60.0],\n ['4', '478832', 10.0],\n ['4', '185593', 70.0],\n ['4', '478346', 0.0],\n ['4', '287226', 50.0],\n ['4', '585561', 20.0],\n ['4', '210226', 60.0],\n ['4', '159191', 50.0],\n ['4', '132081', 90.0],\n ['4', '491489', 90.0],\n ['4', '410356', 80.0],\n ['4', '622665', 90.0],\n ['4', '253686', 90.0],\n ['4', '603153', 90.0],\n ['4', '1916', 70.0],\n ['4', '197126', 80.0],\n ['4', '112993', 0.0],\n ['4', '177475', 50.0],\n ['4', '350507', 70.0],\n ['4', '404659', 70.0],\n ['4', '548317', 90.0],\n ['4', '382094', 70.0],\n ['4', '580963', 70.0],\n ['4', '541988', 70.0],\n ['4', '146909', 80.0],\n ['4', '287649', 70.0],\n ['4', '604863', 50.0],\n ['4', '452968', 90.0],\n ['4', '170071', 80.0],\n ['4', '83208', 80.0],\n ['4', '523835', 60.0],\n ['4', '369282', 60.0],\n ['4', '248038', 0.0],\n ['4', '403499', 80.0],\n ['4', '475701', 60.0],\n ['4', '491985', 70.0],\n ['4', '492603', 50.0],\n ['4', '536930', 60.0],\n ['4', '256420', 50.0],\n ['4', '486761', 90.0],\n ['4', '510233', 90.0],\n ['4', '457583', 90.0],\n ['4', '170988', 60.0],\n ['4', '497786', 80.0],\n ['4', '85795', 70.0],\n ['4', '407212', 90.0],\n ['4', '178047', 80.0],\n ['4', '215524', 80.0],\n ['4', '53898', 70.0],\n ['4', '62890', 80.0],\n ['4', '608647', 60.0],\n ['4', '281829', 80.0],\n ['4', '182140', 90.0],\n ['4', '458719', 70.0],\n ['4', '303578', 50.0],\n ['4', '34525', 60.0],\n ['4', '320337', 90.0],\n ['4', '96319', 0.0],\n ['4', '280263', 90.0],\n ['4', '361474', 0.0],\n ['4', '29391', 70.0],\n ['4', '206576', 60.0],\n ['4', '310752', 70.0],\n ['4', '231645', 80.0],\n ['4', '306720', 70.0],\n ['4', '28482', 0.0],\n ['4', '522813', 60.0],\n ['4', '158437', 60.0],\n ['4', '539126', 70.0],\n ['4', '226511', 80.0],\n ['4', '315075', 60.0],\n ['4', '239592', 90.0],\n ['4', '347410', 40.0],\n ['4', '192632', 60.0],\n ['4', '165104', 70.0],\n ['4', '541394', 70.0],\n ['4', '562248', 70.0],\n ['4', '600261', 80.0],\n ['4', '32953', 80.0],\n ['4', '275044', 60.0],\n ['4', '225168', 50.0],\n ['4', '148987', 60.0],\n ['4', '88523', 80.0],\n ['4', '220090', 60.0],\n ['4', '60120', 80.0],\n ['4', '215845', 80.0],\n ['4', '462759', 70.0],\n ['4', '76266', 80.0],\n ['4', '486413', 90.0],\n ['4', '355155', 90.0],\n ['4', '22492', 70.0],\n ['4', '438293', 50.0],\n ['4', '382070', 90.0],\n ['4', '287072', 0.0],\n ['4', '550438', 80.0],\n ['4', '114139', 90.0],\n ['4', '126175', 90.0],\n ['4', '149603', 10.0],\n ['4', '437608', 30.0],\n ['4', '119327', 70.0],\n ['4', '467178', 10.0],\n ['4', '594702', 90.0],\n ['4', '316218', 70.0],\n ['4', '94745', 90.0],\n ['4', '439902', 0.0],\n ['4', '483540', 60.0],\n ['4', '40539', 90.0],\n ['4', '520313', 0.0],\n ['4', '327995', 60.0],\n ['4', '369348', 70.0],\n ['4', '94767', 70.0],\n ['4', '324656', 20.0],\n ['4', '491124', 80.0],\n ['4', '160143', 80.0],\n ['4', '576640', 60.0],\n ['4', '288744', 60.0],\n ['4', '267846', 10.0],\n ['4', '277744', 90.0],\n ['4', '204362', 70.0],\n ['4', '189952', 90.0],\n ['4', '291817', 0.0],\n ['4', '21788', 70.0],\n ['4', '553257', 60.0],\n ['4', '299835', 70.0],\n ['4', '415358', 70.0],\n ['4', '579518', 0.0],\n ['4', '149616', 60.0],\n ['4', '179785', 70.0],\n ['4', '115492', 70.0],\n ['4', '121914', 90.0],\n ['4', '389944', 80.0],\n ['4', '250270', 10.0],\n ['4', '484153', 90.0],\n ['4', '548055', 10.0],\n ['4', '424295', 60.0],\n ['4', '1785', 60.0],\n ['4', '363510', 60.0],\n ['4', '617683', 90.0],\n ['4', '464977', 80.0],\n ['4', '569447', 60.0],\n ['4', '258945', 70.0],\n ['4', '292961', 0.0],\n ['4', '566574', 70.0],\n ['4', '374484', 50.0],\n ['4', '46682', 70.0],\n ['4', '443881', 0.0],\n ['4', '493655', 60.0],\n ['4', '490404', 60.0],\n ['4', '433883', 70.0],\n ['4', '357972', 30.0],\n ['4', '179392', 60.0],\n ['4', '616136', 50.0],\n ['4', '65155', 80.0],\n ['4', '159688', 10.0],\n ['4', '617646', 90.0],\n ['4', '270248', 90.0],\n ['4', '452300', 70.0],\n ['4', '422865', 80.0],\n ['4', '386593', 80.0],\n ['4', '397620', 70.0],\n ['4', '611138', 70.0],\n ['4', '531983', 90.0],\n ['4', '73161', 70.0],\n ['4', '414408', 70.0],\n ['4', '358465', 0.0],\n ['4', '624626', 80.0],\n ['4', '58857', 70.0],\n ['4', '320895', 50.0],\n ['4', '492284', 60.0],\n ['4', '121870', 50.0],\n ['4', '194118', 90.0],\n ['4', '164263', 60.0],\n ['4', '392569', 60.0],\n ['4', '229311', 80.0],\n ['4', '25311', 70.0],\n ['4', '350024', 0.0],\n ['4', '487577', 80.0],\n ['4', '469906', 90.0],\n ['4', '339526', 90.0],\n ['4', '204005', 80.0],\n ['4', '137571', 70.0],\n ['4', '210114', 70.0],\n ['4', '414557', 70.0],\n ['4', '387396', 90.0],\n ['4', '173954', 0.0],\n ['4', '553664', 60.0],\n ['4', '558154', 40.0],\n ['4', '356485', 100.0],\n ['4', '289148', 80.0],\n ['4', '228988', 50.0],\n ['4', '67176', 70.0],\n ['4', '95938', 60.0],\n ['4', '402563', 60.0],\n ['4', '227333', 70.0],\n ['4', '115180', 80.0],\n ['4', '485372', 60.0],\n ['4', '71713', 50.0],\n ['4', '307244', 10.0],\n ['4', '612520', 60.0],\n ['4', '303067', 10.0],\n ['4', '532490', 70.0],\n ['4', '396048', 80.0],\n ['4', '182507', 90.0],\n ['4', '541173', 60.0],\n ['4', '411217', 50.0],\n ['4', '544071', 70.0],\n ['4', '91904', 60.0],\n ['4', '87553', 70.0],\n ['4', '534541', 70.0],\n ['4', '368797', 80.0],\n ['4', '455400', 70.0],\n ['4', '56438', 60.0],\n ['4', '505275', 70.0],\n ['4', '533654', 90.0],\n ['4', '107900', 10.0],\n ['4', '592326', 0.0],\n ['4', '286002', 80.0],\n ['4', '486392', 30.0],\n ['4', '222784', 70.0],\n ['4', '306057', 70.0],\n ['4', '274787', 70.0],\n ['4', '136867', 10.0],\n ['4', '1547', 90.0],\n ['4', '606573', 90.0],\n ['4', '353629', 60.0],\n ['4', '18519', 60.0],\n ['4', '548750', 100.0],\n ['4', '24474', 50.0],\n ['4', '220442', 80.0],\n ['4', '384221', 10.0],\n ['4', '126974', 90.0],\n ['4', '61568', 70.0],\n ['4', '402475', 0.0],\n ['4', '341539', 70.0],\n ['4', '245449', 90.0],\n ['4', '249526', 70.0],\n ['4', '71255', 60.0],\n ['4', '624282', 80.0],\n ['4', '447406', 90.0],\n ['4', '366520', 0.0],\n ['4', '59337', 70.0],\n ['4', '40476', 90.0],\n ['4', '117158', 90.0],\n ['4', '124511', 0.0],\n ['4', '341372', 70.0],\n ['4', '321362', 90.0],\n ['4', '374802', 80.0],\n ['4', '569772', 60.0],\n ['4', '324045', 65.0],\n ['4', '521255', 70.0],\n ['4', '261661', 60.0],\n ['4', '511755', 0.0],\n ['4', '517703', 90.0],\n ['4', '353897', 90.0],\n ['4', '164989', 90.0],\n ['4', '114215', 70.0],\n ['4', '373124', 70.0],\n ['4', '534119', 90.0],\n ['4', '530325', 0.0],\n ['4', '490327', 80.0],\n ['4', '48098', 70.0],\n ['4', '126713', 70.0],\n ['4', '517860', 70.0],\n ['4', '483649', 10.0],\n ['4', '432452', 60.0],\n ['4', '427765', 80.0],\n ['4', '551307', 70.0],\n ['4', '346454', 70.0],\n ['4', '58190', 100.0],\n ['4', '289519', 90.0],\n ['4', '581975', 0.0],\n ['4', '344617', 70.0],\n ['4', '309265', 80.0],\n ['4', '173926', 80.0],\n ['4', '288047', 70.0],\n ['4', '150752', 70.0],\n ['4', '219179', 0.0],\n ['4', '566154', 60.0],\n ['4', '609551', 70.0],\n ['4', '180768', 60.0],\n ['4', '620594', 70.0],\n ['4', '135170', 80.0],\n ['4', '140811', 60.0],\n ['4', '413919', 70.0],\n ['4', '100118', 80.0],\n ['4', '406596', 90.0],\n ['4', '618051', 50.0],\n ['4', '86177', 80.0],\n ['4', '434897', 90.0],\n ['4', '127505', 80.0],\n ['4', '36798', 100.0],\n ['4', '280997', 0.0],\n ['4', '253829', 70.0],\n ['4', '11263', 70.0],\n ['4', '513454', 60.0],\n ['4', '160409', 70.0],\n ['4', '408629', 100.0],\n ['4', '55629', 20.0],\n ['4', '353598', 50.0],\n ['4', '196323', 60.0],\n ['4', '5073', 50.0],\n ['4', '23521', 90.0],\n ['4', '281127', 60.0],\n ['4', '41693', 60.0],\n ['4', '461012', 90.0],\n ['4', '28621', 10.0],\n ['4', '353376', 70.0],\n ['4', '375832', 80.0],\n ['4', '101687', 50.0],\n ['4', '614811', 70.0],\n ['4', '434455', 60.0],\n ['4', '498672', 60.0],\n ['4', '343333', 60.0],\n ['4', '354193', 80.0],\n ['4', '71477', 30.0],\n ['4', '41112', 60.0],\n ['4', '569386', 60.0],\n ['4', '567655', 70.0],\n ['4', '567378', 90.0],\n ['4', '233263', 70.0],\n ['4', '144114', 100.0],\n ['4', '340949', 60.0],\n ['4', '529650', 60.0],\n ['4', '46539', 90.0],\n ['4', '436595', 0.0],\n ['4', '283576', 70.0],\n ['4', '241657', 0.0],\n ['4', '565069', 70.0],\n ['4', '602877', 60.0],\n ['4', '280533', 0.0],\n ['4', '290893', 60.0],\n ['4', '111411', 60.0],\n ['4', '409071', 70.0],\n ['4', '273062', 70.0],\n ['4', '280165', 90.0],\n ['4', '593900', 90.0],\n ['4', '242513', 90.0],\n ['4', '17571', 50.0],\n ['4', '97426', 80.0],\n ['4', '445582', 80.0],\n ['4', '263935', 90.0],\n ['4', '407244', 60.0],\n ['4', '7623', 70.0],\n ['4', '586428', 70.0],\n ['4', '529022', 90.0],\n ['4', '177936', 100.0],\n ['4', '624017', 0.0],\n ['4', '40593', 90.0],\n ['4', '484334', 80.0],\n ['4', '252174', 30.0],\n ['4', '478952', 80.0],\n ['4', '365283', 60.0],\n ['4', '473428', 100.0],\n ['4', '591609', 80.0],\n ['4', '617397', 60.0],\n ['4', '133867', 70.0],\n ['4', '442960', 0.0],\n ['5', '45715', 30.0],\n ['5', '128050', 30.0],\n ['5', '161920', 0.0],\n ['5', '507010', 70.0],\n ['5', '269566', 50.0],\n ['5', '436810', 0.0],\n ['5', '115038', 30.0],\n ['5', '40662', 0.0],\n ['5', '225285', 0.0],\n ['5', '133443', 30.0],\n ['5', '600781', 70.0],\n ['5', '319540', 0.0],\n ['5', '52616', 30.0],\n ['5', '123679', 30.0],\n ['5', '171626', 70.0],\n ['5', '347719', 50.0],\n ['5', '175835', 30.0],\n ['5', '498308', 30.0],\n ['5', '123025', 70.0],\n ['5', '618263', 0.0],\n ['5', '167290', 30.0],\n ['5', '298318', 0.0],\n ['5', '160067', 30.0],\n ['5', '58718', 70.0],\n ['5', '14354', 0.0],\n ['5', '537982', 0.0],\n ['5', '581781', 0.0],\n ['5', '420409', 90.0],\n ['5', '205077', 0.0],\n ['5', '333689', 30.0],\n ['5', '207892', 0.0],\n ['5', '354352', 50.0],\n ['5', '162422', 50.0],\n ['5', '444400', 0.0],\n ['5', '567212', 0.0],\n ...]"},"metadata":{}}]},{"cell_type":"code","source":"df_train = pd.DataFrame(train_data, columns=['user_id', 'item_id', 'score'])","metadata":{"execution":{"iopub.status.busy":"2023-05-27T14:45:18.254025Z","iopub.execute_input":"2023-05-27T14:45:18.254488Z","iopub.status.idle":"2023-05-27T14:45:20.446208Z","shell.execute_reply.started":"2023-05-27T14:45:18.254451Z","shell.execute_reply":"2023-05-27T14:45:20.445253Z"},"trusted":true},"execution_count":9,"outputs":[]},{"cell_type":"code","source":"print(df_train)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:00:36.514460Z","iopub.execute_input":"2023-05-27T15:00:36.514836Z","iopub.status.idle":"2023-05-27T15:00:36.527332Z","shell.execute_reply.started":"2023-05-27T15:00:36.514806Z","shell.execute_reply":"2023-05-27T15:00:36.526167Z"},"trusted":true},"execution_count":15,"outputs":[{"name":"stdout","text":"        user_id item_id  score\n0             0  518385  100.0\n1             0  550452   90.0\n2             0  600770   80.0\n3             0  194044   90.0\n4             0  295315   90.0\n...         ...     ...    ...\n5001502   19834   88353   70.0\n5001503   19834  173301   90.0\n5001504   19834  276335   90.0\n5001505   19834  211178   90.0\n5001506   19834  280997   90.0\n\n[5001507 rows x 3 columns]\n","output_type":"stream"}]},{"cell_type":"code","source":"# 创建一个 Reader 对象，并指定评分范围\nreader = Reader(rating_scale=(df_train.score.min(), df_train.score.max()))","metadata":{"execution":{"iopub.status.busy":"2023-05-27T14:45:30.257630Z","iopub.execute_input":"2023-05-27T14:45:30.258007Z","iopub.status.idle":"2023-05-27T14:45:30.289886Z","shell.execute_reply.started":"2023-05-27T14:45:30.257976Z","shell.execute_reply":"2023-05-27T14:45:30.288716Z"},"trusted":true},"execution_count":10,"outputs":[]},{"cell_type":"code","source":"print(reader)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:00:46.661942Z","iopub.execute_input":"2023-05-27T15:00:46.662301Z","iopub.status.idle":"2023-05-27T15:00:46.667888Z","shell.execute_reply.started":"2023-05-27T15:00:46.662271Z","shell.execute_reply":"2023-05-27T15:00:46.666731Z"},"trusted":true},"execution_count":16,"outputs":[{"name":"stdout","text":"<surprise.reader.Reader object at 0x78f997cc63e0>\n","output_type":"stream"}]},{"cell_type":"code","source":"# 加载训练数据到 surprise 的数据集中\ntrain_data = Dataset.load_from_df(df_train[['user_id', 'item_id', 'score']], reader)\ntrain_set = train_data.build_full_trainset()","metadata":{"execution":{"iopub.status.busy":"2023-05-27T14:45:39.869462Z","iopub.execute_input":"2023-05-27T14:45:39.869910Z","iopub.status.idle":"2023-05-27T14:45:53.635600Z","shell.execute_reply.started":"2023-05-27T14:45:39.869873Z","shell.execute_reply":"2023-05-27T14:45:53.634660Z"},"trusted":true},"execution_count":11,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_set)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:01:13.536992Z","iopub.execute_input":"2023-05-27T15:01:13.537354Z","iopub.status.idle":"2023-05-27T15:01:13.567230Z","shell.execute_reply.started":"2023-05-27T15:01:13.537326Z","shell.execute_reply":"2023-05-27T15:01:13.566079Z"},"trusted":true},"execution_count":18,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)","Cell \u001b[0;32mIn[18], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mtrain_set\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m)\n","\u001b[0;31mTypeError\u001b[0m: 'Trainset' object is not subscriptable"],"ename":"TypeError","evalue":"'Trainset' object is not subscriptable","output_type":"error"}]},{"cell_type":"code","source":"model = SVD(verbose=True)\nmodel.fit(train_set)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:06:10.959283Z","iopub.execute_input":"2023-05-27T15:06:10.959635Z","iopub.status.idle":"2023-05-27T15:07:22.377424Z","shell.execute_reply.started":"2023-05-27T15:06:10.959606Z","shell.execute_reply":"2023-05-27T15:07:22.376336Z"},"trusted":true},"execution_count":21,"outputs":[{"name":"stdout","text":"Processing epoch 0\nProcessing epoch 1\nProcessing epoch 2\nProcessing epoch 3\nProcessing epoch 4\nProcessing epoch 5\nProcessing epoch 6\nProcessing epoch 7\nProcessing epoch 8\nProcessing epoch 9\nProcessing epoch 10\nProcessing epoch 11\nProcessing epoch 12\nProcessing epoch 13\nProcessing epoch 14\nProcessing epoch 15\nProcessing epoch 16\nProcessing epoch 17\nProcessing epoch 18\nProcessing epoch 19\n","output_type":"stream"},{"execution_count":21,"output_type":"execute_result","data":{"text/plain":"<surprise.prediction_algorithms.matrix_factorization.SVD at 0x78f8f7834f10>"},"metadata":{}}]},{"cell_type":"code","source":"# 使用 SVD++ 训练模型\nmodel = SVDpp(verbose=True)\nmodel.fit(train_set)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T14:51:11.607752Z","iopub.execute_input":"2023-05-27T14:51:11.608306Z","iopub.status.idle":"2023-05-27T15:00:27.518751Z","shell.execute_reply.started":"2023-05-27T14:51:11.608266Z","shell.execute_reply":"2023-05-27T15:00:27.516298Z"},"trusted":true},"execution_count":14,"outputs":[{"name":"stdout","text":" processing epoch 0\n","output_type":"stream"},{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)","Cell \u001b[0;32mIn[14], line 3\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;66;03m# 使用 SVD++ 训练模型\u001b[39;00m\n\u001b[1;32m      2\u001b[0m model \u001b[38;5;241m=\u001b[39m SVDpp(verbose\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m----> 3\u001b[0m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrain_set\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/surprise/prediction_algorithms/matrix_factorization.pyx:400\u001b[0m, in \u001b[0;36msurprise.prediction_algorithms.matrix_factorization.SVDpp.fit\u001b[0;34m()\u001b[0m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/surprise/prediction_algorithms/matrix_factorization.pyx:464\u001b[0m, in \u001b[0;36msurprise.prediction_algorithms.matrix_factorization.SVDpp.sgd\u001b[0;34m()\u001b[0m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/surprise/trainset.py:194\u001b[0m, in \u001b[0;36mTrainset.all_ratings\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    192\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m u, u_ratings \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mur\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m    193\u001b[0m     \u001b[38;5;28;01mfor\u001b[39;00m i, r \u001b[38;5;129;01min\u001b[39;00m u_ratings:\n\u001b[0;32m--> 194\u001b[0m         \u001b[38;5;28;01myield\u001b[39;00m u, i, r\n","\u001b[0;31mKeyboardInterrupt\u001b[0m: "],"ename":"KeyboardInterrupt","evalue":"","output_type":"error"}]},{"cell_type":"code","source":"# 读取测试数据\ntest_data = []\nwith open('test.txt', 'r') as f:\n    for line in f:\n        user_id, n_items = line.strip().split('|')\n        for _ in range(int(n_items)):\n            item_id = next(f).strip()\n            test_data.append([user_id, item_id, 0.0])  # 初始评分设为0\n","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:07:25.924894Z","iopub.execute_input":"2023-05-27T15:07:25.925492Z","iopub.status.idle":"2023-05-27T15:07:26.051951Z","shell.execute_reply.started":"2023-05-27T15:07:25.925459Z","shell.execute_reply":"2023-05-27T15:07:26.050975Z"},"trusted":true},"execution_count":22,"outputs":[]},{"cell_type":"code","source":"# 转换测试数据格式\ndf_test = pd.DataFrame(test_data, columns=['user_id', 'item_id', 'score'])\ntest_set = Dataset.load_from_df(df_test[['user_id', 'item_id', 'score']], reader)\ntest_set = test_set.build_full_trainset().build_testset()\n","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:07:28.107482Z","iopub.execute_input":"2023-05-27T15:07:28.107836Z","iopub.status.idle":"2023-05-27T15:07:28.616573Z","shell.execute_reply.started":"2023-05-27T15:07:28.107807Z","shell.execute_reply":"2023-05-27T15:07:28.615609Z"},"trusted":true},"execution_count":23,"outputs":[]},{"cell_type":"code","source":"# 对测试数据进行预测\npredictions = model.test(test_set)","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:08:10.806681Z","iopub.execute_input":"2023-05-27T15:08:10.807056Z","iopub.status.idle":"2023-05-27T15:08:12.033452Z","shell.execute_reply.started":"2023-05-27T15:08:10.807027Z","shell.execute_reply":"2023-05-27T15:08:12.032399Z"},"trusted":true},"execution_count":25,"outputs":[]},{"cell_type":"code","source":"# 输出预测结果\nwith open('output.txt', 'w') as f:\n    last_uid = None\n    for uid, iid, true_r, est, _ in predictions:\n        if uid != last_uid:\n            f.write(f'{uid}|1\\n')\n        f.write(f'{iid} {est}\\n')\n        last_uid = uid","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:08:14.752003Z","iopub.execute_input":"2023-05-27T15:08:14.752519Z","iopub.status.idle":"2023-05-27T15:08:15.034121Z","shell.execute_reply.started":"2023-05-27T15:08:14.752481Z","shell.execute_reply":"2023-05-27T15:08:15.031985Z"},"trusted":true},"execution_count":26,"outputs":[]},{"cell_type":"code","source":"from surprise import SVDpp\nfrom surprise import Dataset\nfrom surprise import Reader\nimport pandas as pd\n\n# 数据解析函数\ndef parse_data(file_path):\n    data = []\n    with open(file_path, 'r') as f:\n        for line in f:\n            parts = line.strip().split(\"|\")\n            if len(parts) == 2:\n                user_id = parts[0]\n                num_ratings = int(parts[1])\n                user_ratings = []\n                for _ in range(num_ratings):\n                    item_line = next(f)\n                    item_id, score = item_line.strip().split()\n                    user_ratings.append((user_id, item_id, float(score)))\n                data.extend(user_ratings)\n    return data\n\n# 读取训练数据和测试数据\ntrain_data = parse_data('train.txt')\ntest_data = parse_data('test.txt')","metadata":{"execution":{"iopub.status.busy":"2023-05-27T15:12:01.480020Z","iopub.execute_input":"2023-05-27T15:12:01.480475Z","iopub.status.idle":"2023-05-27T15:12:10.194219Z","shell.execute_reply.started":"2023-05-27T15:12:01.480440Z","shell.execute_reply":"2023-05-27T15:12:10.191520Z"},"trusted":true},"execution_count":27,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)","Cell \u001b[0;32mIn[27], line 25\u001b[0m\n\u001b[1;32m     23\u001b[0m \u001b[38;5;66;03m# 读取训练数据和测试数据\u001b[39;00m\n\u001b[1;32m     24\u001b[0m train_data \u001b[38;5;241m=\u001b[39m parse_data(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtrain.txt\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 25\u001b[0m test_data \u001b[38;5;241m=\u001b[39m \u001b[43mparse_data\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mtest.txt\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n","Cell \u001b[0;32mIn[27], line 18\u001b[0m, in \u001b[0;36mparse_data\u001b[0;34m(file_path)\u001b[0m\n\u001b[1;32m     16\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(num_ratings):\n\u001b[1;32m     17\u001b[0m     item_line \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(f)\n\u001b[0;32m---> 18\u001b[0m     item_id, score \u001b[38;5;241m=\u001b[39m item_line\u001b[38;5;241m.\u001b[39mstrip()\u001b[38;5;241m.\u001b[39msplit()\n\u001b[1;32m     19\u001b[0m     user_ratings\u001b[38;5;241m.\u001b[39mappend((user_id, item_id, \u001b[38;5;28mfloat\u001b[39m(score)))\n\u001b[1;32m     20\u001b[0m data\u001b[38;5;241m.\u001b[39mextend(user_ratings)\n","\u001b[0;31mValueError\u001b[0m: not enough values to unpack (expected 2, got 1)"],"ename":"ValueError","evalue":"not enough values to unpack (expected 2, got 1)","output_type":"error"}]},{"cell_type":"code","source":"print(train_data)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print()","metadata":{},"execution_count":null,"outputs":[]}]}